You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否必须处置指定代码创建的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:07:02