一尘不染

何时处置CancellationTokenSource?

c#

该课程CancellationTokenSource是一次性的。快速浏览Reflector即可证明KernelEvent,(很可能是)非托管资源的使用。由于CancellationTokenSource没有终结器,因此如果不处理它,GC将不会这样做。

另一方面,如果您查看MSDN文章“ 托管线程中的取消”中列出的示例,则只有一个代码片段会处理令牌。

用代码处理它的正确方法是什么?

  1. using如果不等待,则不能包装用于启动并行任务的代码。而且只有在您不等待的情况下取消才有意义。
  2. 当然,您可以ContinueWith通过Dispose电话添加任务,但这是可行的方法吗?
  3. 可取消的PLINQ查询如何处理,这些查询不同步回去,而只是在最后做一些事情?比方说.ForAll(x => Console.Write(x))
  4. 可重用吗?可以将同一令牌用于多个调用,然后将其与主机组件(例如UI控件)一起处置吗?

因为它没有像一Reset对清理方法IsCancelRequestedToken字段我想这是不能重复使用,这样每次启动一个任务(或PLINQ查询),你应该创建一个新的。是真的吗
如果是的话,我的问题是,Dispose在这么多CancellationTokenSource情况下应对的正确和推荐策略是什么?


阅读 536

收藏
2020-05-19

共1个答案

一尘不染

谈到是否真的有必要调用Dispose
CancellationTokenSource……我的项目中发生内存泄漏,CancellationTokenSource结果就是问题所在。

我的项目有一个服务,该服务不断读取数据库并触发不同的任务,并且我将链接的取消令牌传递给我的工作人员,因此,即使在他们完成数据处理之后,取消令牌也没有被处置,这导致内存泄漏。

托管线程中的 MSDN
取消明确指出:

请注意,完成处理后,必须调用Dispose链接的令牌源。有关更完整的示例,请参见如何:侦听多个取消请求

ContinueWith在实现中使用过。

2020-05-19