该类CancellationTokenSource是一次性的。快速浏览一下 Reflector 就证明KernelEvent了(很可能)非托管资源的使用。由于CancellationTokenSource没有终结器,如果我们不处置它,GC 就不会这样做。
CancellationTokenSource
KernelEvent
另一方面,如果您查看 MSDN 文章Cancellation in Managed Threads中列出的示例,则只有一个代码片段处理了令牌。
在代码中处理它的正确方法是什么?
using
ContinueWith
Dispose
.ForAll(x => Console.Write(x))
因为它没有类似于Reset清理IsCancelRequested和Token字段的方法,所以我认为它不可重用,因此每次启动任务(或 PLINQ 查询)时,都应该创建一个新任务。这是真的吗?Dispose如果是,我的问题是在这些情况下处理的正确和推荐策略是什么CancellationTokenSource?
Reset
IsCancelRequested
Token
谈到是否真的有必要调用 Dispose CancellationTokenSource......我的项目中有内存泄漏,结果证明这CancellationTokenSource是问题所在。
我的项目有一项服务,它不断读取数据库并触发不同的任务,并且我正在将链接的取消令牌传递给我的工作人员,因此即使在他们完成数据处理之后,取消令牌也没有被释放,这导致了内存泄漏。
MSDN Cancellation in Managed Threads清楚地说明了这一点:
请注意,完成后必须调用Dispose链接的令牌源。有关更完整的示例,请参阅如何:侦听多个取消请求。
我ContinueWith在我的实现中使用过。