最佳实践:正确处理 CancellationTokenSource
CancellationTokenSource
类虽然可被释放,但其正确的释放方式常常让开发者感到困惑。本文深入探讨何时以及如何有效释放此类。
造成这种不清晰的原因之一是 CancellationTokenSource
类没有终结器。这意味着垃圾回收器 (GC) 无法自动释放它。因此,显式释放令牌源就成了开发者的责任。
尽管如此,MSDN 上提供的示例却很少提及释放。那么,推荐的方法是什么呢?
释放策略
等待任务完成时使用 'using' 语句: 如果你正在等待并行任务完成,可以使用 'using' 语句包装代码。这确保了在任务完成后自动释放令牌源:
<code class="language-C#"> using (CancellationTokenSource tokenSource = new CancellationTokenSource()) { Task.Run(() => { }, tokenSource.Token); }</code>
使用 ContinueWith 和手动释放: 或者,你可以在任务上注册一个 ContinueWith 事件处理程序,并在处理程序中手动释放令牌源:
<code class="language-C#"> Task.Run(async () => { try { // 任务代码 } finally { tokenSource.Dispose(); } }, tokenSource.Token);</code>
可取消的 PLINQ 查询: 对于不可同步返回的可取消 PLINQ 查询,推荐的方法是在 CancellationTokenSource
的 Dispose
事件处理程序中执行所有操作。
可重用性和多次使用: CancellationTokenSource
实例不可重用。应为每个取消操作创建和释放它们。
直接释放: 如果你无法使用 'using' 语句或 ContinueWith 事件处理程序,则可以在令牌源完成其用途后直接释放它:
<code class="language-C#"> CancellationTokenSource tokenSource = new CancellationTokenSource(); Task.Run(() => { }, tokenSource.Token); // ... tokenSource.Dispose();</code>
总结
释放 CancellationTokenSource
实例对于防止内存泄漏和确保正确的资源管理至关重要。通过遵守推荐的释放策略,开发人员可以在其代码中有效地处理取消操作。
以上是我应该何时以及如何处置 CancellationTokenSource?的详细内容。更多信息请关注PHP中文网其他相关文章!