首页 >后端开发 >C++ >我应该何时以及如何处置 CancellationTokenSource?

我应该何时以及如何处置 CancellationTokenSource?

Patricia Arquette
Patricia Arquette原创
2025-01-19 11:31:12794浏览

When and How Should I Dispose of a CancellationTokenSource?

最佳实践:正确处理 CancellationTokenSource

CancellationTokenSource 类虽然可被释放,但其正确的释放方式常常让开发者感到困惑。本文深入探讨何时以及如何有效释放此类。

造成这种不清晰的原因之一是 CancellationTokenSource 类没有终结器。这意味着垃圾回收器 (GC) 无法自动释放它。因此,显式释放令牌源就成了开发者的责任。

尽管如此,MSDN 上提供的示例却很少提及释放。那么,推荐的方法是什么呢?

释放策略

  1. 等待任务完成时使用 'using' 语句: 如果你正在等待并行任务完成,可以使用 'using' 语句包装代码。这确保了在任务完成后自动释放令牌源:

    <code class="language-C#"> using (CancellationTokenSource tokenSource = new CancellationTokenSource())
     {
         Task.Run(() => { }, tokenSource.Token);
     }</code>
  2. 使用 ContinueWith 和手动释放: 或者,你可以在任务上注册一个 ContinueWith 事件处理程序,并在处理程序中手动释放令牌源:

    <code class="language-C#"> Task.Run(async () =>
     {
         try
         {
             // 任务代码
         }
         finally
         {
             tokenSource.Dispose();
         }
     }, tokenSource.Token);</code>
  3. 可取消的 PLINQ 查询: 对于不可同步返回的可取消 PLINQ 查询,推荐的方法是在 CancellationTokenSourceDispose 事件处理程序中执行所有操作。

  4. 可重用性和多次使用: CancellationTokenSource 实例不可重用。应为每个取消操作创建和释放它们。

  5. 直接释放: 如果你无法使用 'using' 语句或 ContinueWith 事件处理程序,则可以在令牌源完成其用途后直接释放它:

    <code class="language-C#"> CancellationTokenSource tokenSource = new CancellationTokenSource();
     Task.Run(() => { }, tokenSource.Token);
     // ...
     tokenSource.Dispose();</code>

总结

释放 CancellationTokenSource 实例对于防止内存泄漏和确保正确的资源管理至关重要。通过遵守推荐的释放策略,开发人员可以在其代码中有效地处理取消操作。

以上是我应该何时以及如何处置 CancellationTokenSource?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn