调用CancellationTokenSource.Cancel()后,如何判断异步执行是否继续?
CancellationToken取消请求后异步执行的判断逻辑
你的理解完全正确,两种场景的执行逻辑如下:
- 当
DoSomethingAsync收到取消请求后,停止处理并返回已完成的任务时,await会正常结束,MyMethod会继续执行后续的DoSomethingElse()。 - 当
DoSomethingAsync通过调用myCancellationToken.ThrowIfCancellationRequested()响应取消时,会抛出OperationCanceledException,该异常会中断await后的逻辑,DoSomethingElse()不会被执行。
如何判断实际属于哪种情况?
1. 自行编写的DoSomethingAsync
逻辑完全由你掌控:
- 如果代码中明确调用
ThrowIfCancellationRequested(),或主动抛出OperationCanceledException,则属于抛出异常的取消模式。 - 如果检测到
IsCancellationRequested后,清理资源并返回Task.CompletedTask(或带返回值的Task.FromResult(...)),则属于静默返回完成任务的模式。
2. 第三方库的异步方法
对于无法修改的库代码,可通过以下方式判断:
- 查阅官方文档:正规库的异步方法会明确标注取消行为,说明是抛出取消异常还是静默返回。
- 测试验证:编写测试代码,在调用方法后立即触发取消,观察是否抛出异常,或后续代码是否执行。
- 检查任务状态:获取方法返回的
Task,若Status为Canceled,说明是通过抛出异常响应取消;若Status为RanToCompletion,说明是静默返回完成任务。
避免手动检查的繁琐操作
无需每次调用后都手动检查IsCancellationRequested,可利用任务状态和异常处理机制简化:
- 若库方法采用抛出取消异常的模式,直接用
try/catch包裹await代码块,在catch (OperationCanceledException)中处理取消逻辑即可。 - 若为静默返回模式,仅在后续逻辑依赖取消状态时,在
await后做一次IsCancellationRequested判断即可,无需重复编写检查代码。
内容的提问来源于stack exchange,提问作者Ross
相关产品推荐
相关产品推荐

