CancellationTokenSource与TaskCompletionSource的区别与用法

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.程序结束

原文作者: BG6RSH | 查看原帖

此条目发表在学习笔记分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。