如何在.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
相关产品推荐
相关产品推荐

