gpt4 book ai didi

c# - 何时处置 CancellationTokenSource?

转载 作者:IT王子 更新时间:2023-10-29 03:32:29 24 4
gpt4 key购买 nike

CancellationTokenSource 类是一次性的。快速查看 Reflector 证明使用了 KernelEvent,这是一种(很可能)非托管资源。由于 CancellationTokenSource 没有终结器,如果我们不释放它,GC 将不会执行它。

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

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

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

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

最佳答案

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

我的项目有一个服务,它不断地读取数据库并触发不同的任务,我将链接的取消 token 传递给我的工作人员,所以即使他们完成了数据处理,取消 token 也没有被释放,这导致了内存泄漏。

MSDN Cancellation in Managed Threads明确说明:

Notice that you must call Dispose on the linked token source when you are done with it. For a more complete example, see How to: Listen for Multiple Cancellation Requests.

我在实现中使用了 ContinueWith

关于c# - 何时处置 CancellationTokenSource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6960520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com