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