分页: 1 / 1

CancellationTokenSource与TaskCompletionSource的区别与用法

发表于 : 周六 9月 13, 2025 3:52 pm
BG6RSH
CancellationTokenSource 和 TaskCompletionSource 是 .NET 中用于异步编程的两个核心类,它们分别解决 “如何取消任务” 和 “如何手动控制 Task 的完成” 的问题。

一、CancellationTokenSource 提供取消信号,用于通知异步操作“你该停了”。
  • 作用:生成一个取消令牌(CancellationToken),并控制是否发出取消请求。
  • 使用场景:你想在异步操作中支持“中途取消”。
  • 关键成员:
1. Token:给异步方法传入这个 token,让它能响应取消。
2. Cancel():触发取消信号。
3. CancelAfter(TimeSpan):延迟取消。
  1. Console.WriteLine("1.生成一个取消令牌(CancellationToken),并在 5 秒钟后发出取消请求。");
  2. var cts = new CancellationTokenSource();
  3. cts.CancelAfter(TimeSpan.FromSeconds(5));
  4.  
  5. Console.WriteLine("2.调用异步任务 DoWorkAsync ...");
  6. await DoWorkAsync(cts.Token);
  7.  
  8. Console.WriteLine("3.程序结束");
  9. async Task DoWorkAsync(CancellationToken token)
  10. {
  11.     int i = 0;
  12.     while (!token.IsCancellationRequested)
  13.     {
  14.         await Task.Delay(1000);
  15.         Console.WriteLine($"    第{++i}秒. Working...");
  16.     }
  17.     Console.WriteLine("    任务被取消!");
  18. }
运行结果:
  1. 1.生成一个取消令牌(CancellationToken),并在 5 秒钟后发出取消请求。
  2. 2.调用异步任务 DoWorkAsync ...
  3.     第1秒. Working...
  4.     第2秒. Working...
  5.     第3秒. Working...
  6.     第4秒. Working...
  7.     第5秒. Working...
  8.     任务被取消!
  9. 3.程序结束