C# CancellationToken的使用小结
作者:siyun.chen
在C#中CancellationToken是用于实现协作式取消的核心类型,本文就来详细的介绍一下C# CancellationToken的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在 C# 中,CancellationToken 是用于实现 协作式取消(Cooperative Cancellation) 的核心类型,主要应用于异步操作、多线程任务或长时间运行的任务。以下是详细的讲解:
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);
}
// 清理资源,优雅退出
Console.WriteLine("操作被取消。");
}
抛出取消异常
当需要直接终止操作时,可以通过抛出 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. 异常处理
取消操作通常会引发两种异常:
OperationCanceledExceptionTaskCanceledException(继承自前者)
示例:
try
{
await SomeAsyncMethod(token);
}
catch (OperationCanceledException)
{
Console.WriteLine("操作已被取消。");
}
6. 最佳实践
- 及时传递 Token:将
CancellationToken传递给所有需要支持取消的方法。 - 避免阻塞操作:在非异步代码中定期检查
IsCancellationRequested。 - 正确处理异常:不滥用
try-catch忽略取消异常。 - 释放资源:确保在取消后清理打开的资源(如文件句柄、网络连接)。
7. 使用场景
- 用户取消操作(如界面上的“取消”按钮)。
- 服务限时处理(例如 API 请求超时)。
- 后台任务管理(如 ASP.NET Core 中请求中止处理)。
- 并行任务控制(取消一组相关任务)。
8. 完整示例
var cts = new CancellationTokenSource();
var token = cts.Token;
// 启动任务
var task = Task.Run(() =>
{
try
{
while (true)
{
token.ThrowIfCancellationRequested();
Console.WriteLine("工作...");
Thread.Sleep(1000);
}
}
catch (OperationCanceledException)
{
Console.WriteLine("任务取消。");
}
});
// 例如:用户按下取消按钮,或者超时自动取消
Thread.Sleep(3000);
cts.Cancel();
9. 注意事项
- 线程安全:
CancellationToken是一个只读结构体,本身线程安全。 - 资源释放:
CancellationTokenSource实现了IDisposable,长时间不使用时需释放。 - 不可复用:一旦取消,Token 无法重新激活,需创建新的
CancellationTokenSource。
到此这篇关于C# CancellationToken的使用小结的文章就介绍到这了,更多相关C# CancellationToken使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
