由 BG6RSH » 周六 9月 13, 2025 3:52 pm
CancellationTokenSource 和 TaskCompletionSource 是 .NET 中用于异步编程的两个核心类,它们分别解决 “如何取消任务” 和 “如何手动控制 Task 的完成” 的问题。
一、CancellationTokenSource 提供取消信号,用于通知异步操作“你该停了”。
- 作用:生成一个取消令牌(CancellationToken),并控制是否发出取消请求。
1. Token:给异步方法传入这个 token,让它能响应取消。
2. Cancel():触发取消信号。
3. CancelAfter(TimeSpan):延迟取消。
Console.WriteLine("1.生成一个取消令牌(CancellationToken),并在 5 秒钟后发出取消请求。");
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(5));
Console.WriteLine("2.调用异步任务 DoWorkAsync ...");
await DoWorkAsync(cts.Token);
Console.WriteLine("3.程序结束");
async Task DoWorkAsync(CancellationToken token)
{
int i = 0;
while (!token.IsCancellationRequested)
{
await Task.Delay(1000);
Console.WriteLine($" 第{++i}秒. Working...");
}
Console.WriteLine(" 任务被取消!");
}
运行结果:
1.生成一个取消令牌(CancellationToken),并在 5 秒钟后发出取消请求。
2.调用异步任务 DoWorkAsync ...
第1秒. Working...
第2秒. Working...
第3秒. Working...
第4秒. Working...
第5秒. Working...
任务被取消!
3.程序结束
[b]CancellationTokenSource 和 TaskCompletionSource 是 .NET 中用于异步编程的两个核心类,它们分别解决 “如何取消任务” 和 “如何手动控制 Task 的完成” 的问题。[/b]
一、CancellationTokenSource 提供取消信号,用于通知异步操作“你该停了”。
[list]作用:生成一个取消令牌(CancellationToken),并控制是否发出取消请求。[/list]
[list]使用场景:你想在异步操作中支持“中途取消”。[/list]
[list]关键成员:[/list]
1. Token:给异步方法传入这个 token,让它能响应取消。
2. Cancel():触发取消信号。
3. CancelAfter(TimeSpan):延迟取消。
[Codebox=csharp file=Untitled.cs]
Console.WriteLine("1.生成一个取消令牌(CancellationToken),并在 5 秒钟后发出取消请求。");
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(5));
Console.WriteLine("2.调用异步任务 DoWorkAsync ...");
await DoWorkAsync(cts.Token);
Console.WriteLine("3.程序结束");
async Task DoWorkAsync(CancellationToken token)
{
int i = 0;
while (!token.IsCancellationRequested)
{
await Task.Delay(1000);
Console.WriteLine($" 第{++i}秒. Working...");
}
Console.WriteLine(" 任务被取消!");
}
[/Codebox]
运行结果:
[Codebox=bash file=Untitled.bsh]1.生成一个取消令牌(CancellationToken),并在 5 秒钟后发出取消请求。
2.调用异步任务 DoWorkAsync ...
第1秒. Working...
第2秒. Working...
第3秒. Working...
第4秒. Working...
第5秒. Working...
任务被取消!
3.程序结束[/Codebox]