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("操作已被取消。");

}

相关推荐
Wang's Blog27 分钟前
Java 项目实战:交友项目 - 我的访客:需求说明
java·开发语言·交友
布莱克6051 小时前
C++ 中堆和栈的区别详解
开发语言·c++·栈·堆
像风一样自由20201 小时前
3.Dockerfile如何构建一个Python算法镜像
开发语言·人工智能·python·大模型
BuHuaX2 小时前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua
xys_6782 小时前
深挖C++:C++入门基础
开发语言·c++
asdzx673 小时前
C# 操作 PDF 元数据:从属性写入到字段提取的完整流程
前端·pdf·c#
幻境如梦丶皆为虚3 小时前
从零写一个 DSH 插件:在左侧菜单栏加一个「测试」
开发语言·javascript·ecmascript
LabVIEW开发3 小时前
LabVIEW 局部变量与数据流:这道 CLAD 题为什么答案是 Undefined
java·开发语言·labview
路溪非溪3 小时前
C++标准库之智能指针
linux·开发语言·c++