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

如何在.NET中创建层级结构的CancellationTokenSource?

关于层级式CancellationTokenSource的实现问题解答

原生支持情况

.NET 原生已经内置了你需要的单向层级取消能力,无需自定义实现核心逻辑。
你可以调用CancellationTokenSource.CreateLinkedTokenSource()方法,传入父级CancellationToken来生成关联的子级CancellationTokenSource实例,该特性在.NET Framework 4.0、.NET Core 1.0及之后的所有版本都可用。
原生实现的行为完全匹配你的需求:

  • 父级CancellationTokenSource触发取消时,所有关联的子级、孙级等整个链路的关联CancellationTokenSource都会同步进入取消状态
  • 子级CancellationTokenSource主动调用Cancel()时,不会向上传导到任何父级源

自行注册父级委托的风险

如果你不使用原生API,仅手动给父级Token注册取消子源的委托是远远不够的,会存在多个隐患:

  • 内存泄漏风险:你注册的委托会持有子源的强引用,如果父级源生命周期远长于子任务,子源在任务执行完后也无法被GC回收,只有父级释放后才能回收
  • 并发异常风险:需要自行处理父级取消、子源主动取消、子源释放三个操作的并发冲突,比如子源已经释放后父级才触发取消,会触发ObjectDisposedException
  • 链路一致性问题:多级层级场景下自行维护委托注册逻辑,很容易出现漏通知、状态不同步的问题

注意事项

即使用原生的关联CTS能力,也需要注意两个点:

  • 所有创建的CancellationTokenSource(包括关联生成的子源)都需要在使用完毕后调用Dispose()释放,避免残留资源占用
  • 不要跨层级持有CTS引用操作,仅在对应业务层级操作自己的CTS实例即可,取消的传导由原生机制自动处理

内容的提问来源于stack exchange,提问作者momvart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:03:03