- 基本使用方法
 - 创建 `CancellationTokenSource`
 - 获取 `CancellationToken`
 - 将 `CancellationToken` 传递给任务
 - ***注意***
 
- 在任务中检查取消状态
 - 请求取消
 - 处理取消异常
 
- 高级用法
 - 设置超时自动取消
 - 或者使用 `CancelAfter` 方法
 - 关联多个取消令牌
 - 注册回调
 
- 注意事项
 
CancellationTokenSource 是 
C# 中用于实现异步操作取消的核心类,它生成 
CancellationToken 对象,该对象可以传递给异步方法,并在异步方法内部检查是否收到取消请求。 
 
基本使用方法
创建 CancellationTokenSource
 
CancellationTokenSource cts = new CancellationTokenSource();
 
获取 CancellationToken
 
CancellationToken token = cts.Token;
 
将 CancellationToken 传递给任务
 
Task task = Task.Run(() => DoWork(token), token);
 
注意
// 传递给
Task.Run(() => {Foo();
}, token);
// 的token只是在Task开始运行前检查一次是否取消,如果取消,Run不了一点
 
在任务中检查取消状态
static void DoWork(CancellationToken token)
{for (int i = 0; i < 10; i++){// 检查是否收到取消请求if (token.IsCancellationRequested)token.ThrowIfCancellationRequested();// 此处抛出异常,外面用try catch捕获Console.WriteLine($"Task working... {i}");Thread.Sleep(500); // 模拟耗时操作}
}
 
请求取消
cts.Cancel();
 
处理取消异常
try
{await task;
}
catch (OperationCanceledException)
{Console.WriteLine("Task was cancelled.");
}
 
高级用法
设置超时自动取消
CancellationTokenSource cts = new CancellationTokenSource(5000); // 5秒后自动取消
CancellationToken token = cts.Token;
 
或者使用 CancelAfter 方法
 
CancellationTokenSource cts = new CancellationTokenSource();
cts.CancelAfter(5000); // 5秒后自动取消
 
关联多个取消令牌
CancellationTokenSource tokenSource1 = new CancellationTokenSource();
CancellationTokenSource tokenSource2 = new CancellationTokenSource();CancellationTokenSource linkedTokenSource =CancellationTokenSource.CreateLinkedTokenSource(tokenSource1.Token, tokenSource2.Token);linkedTokenSource.Token.Register(() => Console.WriteLine("Linked token cancelled")
);tokenSource1.Cancel(); // 会触发 linkedTokenSource 的取消
 
注册回调
token.Register(() => Console.WriteLine("Cancellation requested"));
 
注意事项
- 取消操作是协作式的,任务必须主动检查 
CancellationToken的状态。 CancellationTokenSource的Cancel方法会触发所有注册的回调。- 默认情况下,
CancellationTokenSource是一次性的,取消后无法重置。 
通过这些方法,CancellationTokenSource 可以有效地管理异步操作的取消。