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

}

相关推荐
Scout-leaf2 天前
WPF新手村教程(三)—— 路由事件
c#·wpf
用户298698530142 天前
程序员效率工具:Spire.Doc如何助你一键搞定Word表格排版
后端·c#·.net
mudtools3 天前
搭建一套.net下能落地的飞书考勤系统
后端·c#·.net
玩泥巴的3 天前
搭建一套.net下能落地的飞书考勤系统
c#·.net·二次开发·飞书
唐宋元明清21883 天前
.NET 本地Db数据库-技术方案选型
windows·c#
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
lindexi3 天前
dotnet DirectX 通过可等待交换链降低输入渲染延迟
c#·directx·d2d·direct2d·vortice
feifeigo1233 天前
matlab画图工具
开发语言·matlab
dustcell.3 天前
haproxy七层代理
java·开发语言·前端
norlan_jame3 天前
C-PHY与D-PHY差异
c语言·开发语言