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
可以有效地管理异步操作的取消。