最佳实践:正确处理 CancellationTokenSource
CancellationTokenSource
类虽然可被释放,但其正确的释放方式常常让开发者感到困惑。本文深入探讨何时以及如何有效释放此类。
造成这种不清晰的原因之一是 CancellationTokenSource
类没有终结器。这意味着垃圾回收器 (GC) 无法自动释放它。因此,显式释放令牌源就成了开发者的责任。
尽管如此,MSDN 上提供的示例却很少提及释放。那么,推荐的方法是什么呢?
释放策略
等待任务完成时使用 'using' 语句: 如果你正在等待并行任务完成,可以使用 'using' 语句包装代码。这确保了在任务完成后自动释放令牌源:
using (CancellationTokenSource tokenSource = new CancellationTokenSource())
{
Task.Run(() => { }, tokenSource.Token);
}
使用 ContinueWith 和手动释放: 或者,你可以在任务上注册一个 ContinueWith 事件处理程序,并在处理程序中手动释放令牌源:
Task.Run(async () =>
{
try
{
// 任务代码
}
finally
{
tokenSource.Dispose();
}
}, tokenSource.Token);
可取消的 PLINQ 查询: 对于不可同步返回的可取消 PLINQ 查询,推荐的方法是在 CancellationTokenSource
的 Dispose
事件处理程序中执行所有操作。
可重用性和多次使用: CancellationTokenSource
实例不可重用。应为每个取消操作创建和释放它们。
直接释放: 如果你无法使用 'using' 语句或 ContinueWith 事件处理程序,则可以在令牌源完成其用途后直接释放它:
CancellationTokenSource tokenSource = new CancellationTokenSource();
Task.Run(() => { }, tokenSource.Token);
// ...
tokenSource.Dispose();
总结
释放 CancellationTokenSource
实例对于防止内存泄漏和确保正确的资源管理至关重要。通过遵守推荐的释放策略,开发人员可以在其代码中有效地处理取消操作。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3