请说明 CancellationTokenSource 在 .NET 中负责哪些职责,以及 CancellationToken 如何通过它实现协作式取消,两者间的交互流程是什么?
考察说明
考察对 C# 协作式取消机制的理解,包括令牌来源、注册回调与取消通知的传播方式。
回答思路
- 【回答框架 1】CancellationTokenSource 是取消信号的源头,提供 Cancel 和 CancelAfter 等方法触发取消;CancellationToken 是消费端结构,通过注册回调、轮询 IsCancellationRequested 或等待 WaitHandle 接收取消通知。
- 【回答框架 2】协同流程:调用方创建 CTS 实例,将其 Token 属性传递给任务或异步方法;任务内可注册取消回调或定期检查令牌状态,CTS 触发取消时令牌置位,回调按注册顺序执行,并通过 OperationCanceledException 传播取消。
- 【回答框架 3】关键点在于令牌是轻量级副本,可自由传递;CTS 需在不再需要时调用 Dispose 释放资源,避免泄漏;取消是协作式的,若不主动检查或响应,取消不会强制中断执行。
- 【回答框架 4】在异步场景中,与 CancellationToken 配合应使用 Register 方法或异步等待,如 Task.Run 传入令牌,确保任务在取消时可及时退出,避免无响应。
- 【关键点 1】CancellationTokenSource 生成令牌并控制取消信号,令牌负责监听和响应。
- 【关键点 2】取消通过设置 IsCancellationRequested 和触发回调实现,回调按注册顺序执行。
- 【关键点 3】协作式取消要求任务主动检查令牌,不能强制中断线程。
- 【关键点 4】CTS 在使用后应 Dispose,避免资源泄漏。
- 【易错点 1】将令牌用于阻塞等待时,若未使用 WaitHandle 或 CancelAfter,可能导致取消无法立即响应。
- 【易错点 2】多次注册回调可能引发异常,需谨慎处理回调中的资源开销。
- 【易错点 3】在取消后继续使用已取消的令牌可能导致误操作,需检查状态再执行后续。