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