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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:46:05