即发即弃任务场景下,CancellationTokenSource仅调用Cancel()是否无需Dispose?
即发即弃任务中CancellationTokenSource:只调用Cancel()就够了?
结论先行
在即发即弃任务场景下,仅调用Cancel()完全可行,不需要额外调用Dispose()。
为什么不用Dispose()?
- 调用
Cancel()时,CancellationTokenSource会自动清理内部的计时器、所有已注册的回调等资源,和Dispose()做的核心资源释放工作是重叠的。 Dispose()的设计初衷是释放非托管资源,但如果已经通过Cancel()完成了内部资源的清理,再调用Dispose()属于重复操作,没实际意义。- 即发即弃任务本身就是脱离主线程控制流的,你很难(也没必要)在任务完成后再去追踪调用
Dispose()——任务执行结束的时机不确定,强行追踪反而容易搞出额外问题。
额外提醒
- 如果是在长期运行的服务里高频创建CancellationTokenSource,用
using块(自动触发Dispose())更符合代码规范,但这是锦上添花的操作,不是必须的。 - 重点还是要确保你的任务在收到取消信号时能正确终止,别出现资源泄漏或者挂着不结束的情况。
内容的提问来源于stack exchange,提问作者user13251051
相关产品推荐
相关产品推荐

