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

}

相关推荐
禾叙_几秒前
【langchain4j】结构化输出(六)
java·开发语言
NQBJT2 分钟前
VS Code配置Python人工智能开发环境
开发语言·人工智能·vscode·python
byoass9 分钟前
智巢AI知识库深度解析:企业文档管理从大海捞针到精准狙击的进化之路
开发语言·网络·人工智能·安全·c#·云计算
南境十里·墨染春水21 分钟前
C++笔记 STL——set
开发语言·c++·笔记
L16247622 分钟前
Win11 共享→Windows Server 访问故障总结(极简可复用)
开发语言·windows·php
.柒宇.1 小时前
FastAPI 基础指南:从入门到实战
开发语言·python·fastapi
xyq20241 小时前
Go 错误处理
开发语言
JAVA面经实录9171 小时前
企业级java+LangChain4j-RAG系统 限流熔断降级
java·开发语言·分布式·langchain
Slow菜鸟1 小时前
Codex CLI 教程(五)| AI 驱动项目从零到一:面向 Java 全栈工程师打造个人 ECC(V2版)
java·开发语言·人工智能
lsx2024061 小时前
Julia 基本运算符
开发语言