C# CancellationToken

C# CancellationToken详解

在 C# 中,CancellationToken 的核心类型,主要应用于异步操作、多线程任务或长时间运行的任务。以下是详细的讲解:

1. 概念

作用:允许一个任务/操作在外部被请求取消,任务自身会定期检查是否被取消请求,实现终止。

协作式:任务需要主动配合检查取消请求(不能强行终止线程)。

组成:

CancellationTokenSource:生成和管理 CancellationToken 的类。

CancellationToken:传递给任务的结构体,用于传递"取消信号"。

2. 基本用法
步骤 1:创建 CancellationTokenSource 和 Token

var cts = new CancellationTokenSource();

CancellationToken token = cts.Token;

步骤 2:将 Token 传递给任务

Task.Run(() =>

{

// 任务逻辑

}, token);

步骤 3:触发取消

cts.Cancel(); // 请求取消所有关联 Token 的任务

3. 在任务中处理取消
轮询检查 Token

public void LongRunningOperation(CancellationToken token)

{

while (!token.IsCancellationRequested)

{

// 持续工作...

Thread.Sleep(1000);

}

// 清理资源,优雅退出

ct.Register(() => Console.WriteLine("ClearResources));

抛出取消异常

当需要直接终止操作时,可以通过抛出 OperationCanceledException 来快速响应取消请求:

token.ThrowIfCancellationRequested(); // 如果取消已请求,抛出异常

4. 高级特性
注册取消回调

当取消被触发时,执行指定的回调函数(如释放资源):

token.Register(() =>

{

Console.WriteLine("清理资源,取消已触发!");

});

超时自动取消

利用 CancellationTokenSource 设置超时时间,自动触发取消:

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); // 5秒后自动取消

组合 Token(链接)

将多个 CancellationToken 组合成一个,任一触发则全部取消:

var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(token1, token2);

var linkedToken = linkedCts.Token;

5. 异常处理

取消操作通常会引发两种异常:

  • OperationCanceledException
  • TaskCanceledException(继承自前者)

try

{

await MyAsyncMethod(token);

}

catch (OperationCanceledException)

{

Console.WriteLine("操作已被取消。");

}

相关推荐
Joy T3 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
专注仿真7 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes7 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停7 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金9 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
爱上网的小舟9 小时前
星际战士2启动错误怎么办?5种游戏报错解决方法
开发语言·php
阿里嘎多学长10 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管
wangchunyu11411 小时前
Python 数据可视化实战入门教程
开发语言·python·信息可视化
学逆向的13 小时前
C 突破编译器限制
c语言·开发语言·网络安全
jimy113 小时前
C++ 虚函数表:基类和派生类共用一张 vtable 吗?
开发语言·c++