

新闻资讯
技术百科CancellationToken 是 C# 中协作式取消异步操作的标准方式,通过传递 token 到支持的方法(如 GetAsync)或在自定义逻辑中调用 ThrowIfCancellationRequested() 实现优雅退出。
在C#中,CancellationToken 是取消异步操作的标准、安全且协作式的方式。它本身不强制终止线程或任务,而是通过“通知”机制让异步方法主动检查并优雅退出。
大多数内置异步方法(如 HttpClient.GetAsync、Stream.ReadAsync、Task.Delay)都支持接收 CancellationToken 参数。只要传入,它们会在内部监听取消信号,并在触发时抛出 OperationCanceledException(通常无需手动捕获,除非需特殊处理)。
await httpClient.GetAsync("https://api.example.com", cancellationToken);
写自己的 async 方法时
,需定期调用 cancellationToken.ThrowIfCancellationRequested() 或检查 cancellationToken.IsCancellationRequested,尤其在长时间运行或循环中。
ThrowIfCancellationRequested():简洁且与系统行为一致IsCancellationRequested 却不抛异常——这会让调用方无法统一捕获取消状态for (int i = 0; i < 100; i++)
{
cancellationToken.ThrowIfCancellationRequested();
await Task.Delay(100, cancellationToken); // 这里也传 token
}
通常用 CancellationTokenSource 创建 token 并控制取消。它是一次性对象,调用 Cancel() 后所有关联的 token 都会进入已取消状态。
var cts = new CancellationTokenSource();,然后传 cts.Token 给异步方法new CancellationTokenSource(TimeSpan.FromSeconds(5)),时间到自动取消cts.Dispose()(尤其在 using 块中),释放底层资源Cancel();多次调用无害但没必要取消引发的 OperationCanceledException 是正常流程的一部分。建议按需捕获,但不要“吞掉”它而不做响应——否则可能掩盖真实取消意图。
catch (OperationCanceledException) when (e.CancellationToken == myToken)
finally 或 using 中做必要清理(如关闭流、释放句柄)Task 状态是 TaskStatus.Canceled,不是 Faulted
基本上就这些。核心是“协作”而非“强制”,关键在于方法签名支持、token 正确传递、及时检查、合理清理。用对了,异步取消既可靠又干净。