班上CancellationTokenSource
是一次性的。快速查看 Reflector 证明了KernelEvent
,(很可能)非托管资源。
自从CancellationTokenSource
没有终结器,如果我们不处理它,GC就不会这样做。
另一方面,如果您查看 MSDN 文章中列出的示例托管线程中的取消 http://msdn.microsoft.com/en-us/library/dd997364.aspx,只有一个代码片段处理令牌。
在代码中处理它的正确方法是什么?
- 您不能使用以下方式包装启动并行任务的代码
using
如果你不等待的话。只有当您不等待时取消才有意义。
- 当然你可以添加
ContinueWith
执行任务时Dispose
打电话,但这是要走的路吗?
- 可取消的 PLINQ 查询怎么样,它不会同步回来,只是在最后做一些事情?比方说
.ForAll(x => Console.Write(x))
?
- 它可以重复使用吗?是否可以将同一个令牌用于多个调用,然后将其与主机组件(例如 UI 控制)一起处理?
因为它没有类似的东西Reset
清理方法IsCancelRequested
and Token
我认为它不可重用,因此每次启动任务(或 PLINQ 查询)时,都应该创建一个新任务。这是真的吗?如果是,我的问题是正确和推荐的处理策略是什么Dispose
对那些许多CancellationTokenSource
实例?
谈论是否真的有必要调用Dispose onCancellationTokenSource
...我的项目中出现了内存泄漏,结果是CancellationTokenSource
是问题所在。
我的项目有一项服务,它不断读取数据库并触发不同的任务,并且我将链接的取消令牌传递给我的工作人员,因此即使他们完成数据处理后,取消令牌也没有被处理,这导致了内存泄漏。
MSDN 托管线程中的取消 http://msdn.microsoft.com/en-us/library/dd997364.aspx明确指出:
请注意,您必须致电Dispose
当您完成使用链接的令牌源时。有关更完整的示例,请参阅如何:监听多个取消请求 https://learn.microsoft.com/en-us/dotnet/standard/threading/how-to-listen-for-multiple-cancellation-requests.
I used ContinueWith
在我的实施中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)