小编典典

何时处置 CancellationTokenSource?

all

该类CancellationTokenSource是一次性的。快速浏览一下 Reflector
就证明KernelEvent了(很可能)非托管资源的使用。由于CancellationTokenSource没有终结器,如果我们不处置它,GC
就不会这样做。

另一方面,如果您查看 MSDN 文章Cancellation in Managed
Threads
中列出的示例,则只有一个代码片段处理了令牌。

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

  1. using如果您不等待,则无法包装开始并行任务的代码。只有在您不等待的情况下取消才有意义。
  2. 当然,您可以ContinueWith通过调用添加任务Dispose,但这是要走的路吗?
  3. 可取消的 PLINQ 查询不同步回来,但只是在最后做一些事情呢?比方说.ForAll(x => Console.Write(x))
  4. 它可以重复使用吗?是否可以将同一个令牌用于多个调用,然后将其与宿主组件一起处置,比如 UI 控件?

因为它没有类似于Reset清理IsCancelRequestedToken字段的方法,所以我认为它不可重用,因此每次启动任务(或 PLINQ
查询)时,都应该创建一个新任务。这是真的吗?Dispose如果是,我的问题是在这些情况下处理的正确和推荐策略是什么CancellationTokenSource


阅读 145

收藏
2022-07-06

共1个答案

小编典典

谈到是否真的有必要调用 Dispose
CancellationTokenSource......我的项目中有内存泄漏,结果证明这CancellationTokenSource是问题所在。

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

MSDN Cancellation in Managed Threads清楚地说明了这一点:

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

ContinueWith在我的实现中使用过。

2022-07-06