CancellationTokenSource (CTS): 这是生成取消令牌的主要对象。可以通过调用它的 Cancel 方法来请求取消一个或多个操作。
CancellationToken (CT): 这是一个轻量级的结构,由 CancellationTokenSource 生成,并可以传递到多个操作中。操作可以检查此令牌的状态以确定是否应该取消其执行。
使用方式
1.创建 CancellationTokenSource实例。
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
2.从 CancellationTokenSource 获取一个 CancellationToken。
CancellationToken token = cancellationTokenSource.Token;
3.传递 CancellationToken: 将此令牌传递给支持取消操作的方法或任务。
Task myTask = Task.Run(() =>
{
// 任务的代码
while (true)
{
token.ThrowIfCancellationRequested();
// 执行一些任务
}
}, token);
4.请求取消: 想取消与此 CancellationTokenSource 关联的所有操作时,调用 Cancel 方法。
cancellationTokenSource.Cancel();
5.处理取消请求: 在任务或操作中,定期检查令牌的状态,并在适当的时候响应取消请求。这可以通过调用 token.ThrowIfCancellationRequested()(这将抛出一个 OperationCanceledException)或检查 token.IsCancellationRequested 属性来实现。
完整示例代码:
class Program
{
static async Task Main(string[] args)
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
Task task = Task.Run(() =>
{
while (!token.IsCancellationRequested)
{
Thread.Sleep(100);
Console.WriteLine("正在工作");
}
token.ThrowIfCancellationRequested();
}, token);
try
{
Thread.Sleep(1500);
cts.Cancel(); // 请求取消
await task; // 等待任务完成
}
catch (OperationCanceledException)
{
Console.WriteLine("操作已取消");
}
finally
{
cts.Dispose();
}
}
}
注意事项:
1.取消是协作性的: 接收取消令牌的操作需要定期检查令牌的状态,并决定何时停止执行。
2.取消异常: 当操作因取消而停止时,通常会抛出 OperationCanceledException。
3.及时释放资源: CancellationTokenSource 实现了 IDisposable 接口,所以在不再需要时应该被释放,以避免资源泄漏。