是否必须处置指定代码创建的CancellationTokenSource?若需,该如何操作?
CancellationTokenSource的处置问题解答
是否必须处置?
是的,CancellationTokenSource实现了IDisposable接口,尤其是你使用带超时参数的构造函数(如代码中new CancellationTokenSource(sleepDuration.Add(TimeSpan.FromSeconds(-1))))时,它内部会创建Timer来触发取消信号。如果不手动处置,这些Timer资源无法被及时释放,长期运行会造成内存泄漏。
如何正确处置?
不能直接用using语句包裹resetSignal的创建(会在代码块结束时立即释放资源,导致注册的回调无法执行),正确做法是在注册的回调执行完成后调用Dispose。
同步方法中的修改
var resetSignal = new CancellationTokenSource(sleepDuration.Add(TimeSpan.FromSeconds(-1))); resetSignal.Token.Register(() => { try { ctx.Remove(SleepDurationKey); asyncPolicy.Reset(); } finally { resetSignal.Dispose(); // 回调执行完毕后释放资源 } });
异步方法中的修改
var resetSignal = new CancellationTokenSource(sleepDuration.Add(TimeSpan.FromSeconds(-1))); resetSignal.Token.Register(() => { try { ctx.Remove(SleepDurationKey); asyncPolicy.Reset(); } finally { resetSignal.Dispose(); // 回调执行完毕后释放资源 } });
补充说明
- 当
CancellationTokenSource的超时触发后,内部Timer会自动停止,此时调用Dispose是安全的,不会影响已注册回调的执行。 - 这种方式确保每个创建的
CancellationTokenSource都能被正确释放,避免长期运行时的资源泄漏问题。
内容的提问来源于stack exchange,提问作者nop
相关产品推荐
相关产品推荐

