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