C#中 Task 团结 CancellationTokenSource的妙用

打印 上一主题 下一主题

主题 905|帖子 905|积分 2715

在.NET中,CancellationTokenSourceCancellationTokenTask是处置惩罚异步操纵和取消任务的紧张工具。本文将通过一些简单的例子,帮助你理解它们的用法和协作方式。
CancellationTokenSource

CancellationTokenSource 是一个取消操纵的触发器。它用于生成和管理CancellationToken,并控制取消信号的发出。
常用属性和方法


  • Token: 返回一个与此源关联的CancellationToken。
  • Cancel(): 触发取消操纵。
  • CancelAfter(milliseconds): 指定时间后触发取消操纵。
  • Dispose(): 释放资源。
示例
  1. var cts = new CancellationTokenSource();
  2. CancellationToken token = cts.Token;
  3. Task.Run(() => {
  4.     for (int i = 0; i < 10; i++)
  5.     {
  6.         if (token.IsCancellationRequested)
  7.         {
  8.             Console.WriteLine("Task canceled");
  9.             break;
  10.         }
  11.         Console.WriteLine($"Task running: {i}");
  12.         Thread.Sleep(500);
  13.     }
  14. });
  15. Thread.Sleep(2000);
  16. cts.Cancel();
复制代码
CancellationToken

CancellationToken 是用于传播取消请求的轻量级结构。它由CancellationTokenSource生成。
常用属性和方法


  • IsCancellationRequested: 是否收到取消请求。
  • ThrowIfCancellationRequested(): 如果已请求取消,抛出OperationCanceledException。
  • Register(Action): 注册一个取消时触发的回调。
示例
  1. var cts = new CancellationTokenSource();
  2. CancellationToken token = cts.Token;
  3. Task.Run(() => {
  4.     token.Register(() => Console.WriteLine("Cancellation registered"));
  5.     try
  6.     {
  7.         for (int i = 0; i < 10; i++)
  8.         {
  9.             token.ThrowIfCancellationRequested();
  10.             Console.WriteLine($"Task running: {i}");
  11.             Thread.Sleep(500);
  12.         }
  13.     }
  14.     catch (OperationCanceledException)
  15.     {
  16.         Console.WriteLine("Task was canceled");
  17.     }
  18. });
  19. Thread.Sleep(2000);
  20. cts.Cancel();
复制代码
Task与CancellationToken

Task 是.NET中的异步操纵单元。团结CancellationToken可以在任务运行时取消它。
示例:取消任务
  1. var cts = new CancellationTokenSource();
  2. CancellationToken token = cts.Token;
  3. Task task = Task.Run(() => {
  4.     for (int i = 0; i < 10; i++)
  5.     {
  6.         if (token.IsCancellationRequested)
  7.         {
  8.             Console.WriteLine("Task canceled");
  9.             break;
  10.         }
  11.         Console.WriteLine($"Task running: {i}");
  12.         Thread.Sleep(500);
  13.     }
  14. }, token);
  15. Thread.Sleep(2000);
  16. cts.Cancel();
  17. try
  18. {
  19.     task.Wait();
  20. }
  21. catch (AggregateException ex)
  22. {
  23.     foreach (var inner in ex.InnerExceptions)
  24.     {
  25.         if (inner is TaskCanceledException)
  26.         {
  27.             Console.WriteLine("Task cancellation exception caught");
  28.         }
  29.     }
  30. }
复制代码
示例:带超时的任务
  1. var cts = new CancellationTokenSource(3000); // 3秒后自动取消
  2. CancellationToken token = cts.Token;
  3. Task.Run(() => {
  4.     try
  5.     {
  6.         for (int i = 0; i < 10; i++)
  7.         {
  8.             token.ThrowIfCancellationRequested();
  9.             Console.WriteLine($"Task running: {i}");
  10.             Thread.Sleep(1000);
  11.         }
  12.     }
  13.     catch (OperationCanceledException)
  14.     {
  15.         Console.WriteLine("Task canceled due to timeout");
  16.     }
  17. });
复制代码
小结


  • 使用CancellationTokenSource来控制取消。
  • 通过CancellationToken将取消信号传递给任务或方法。
  • 任务中可以通过ThrowIfCancellationRequested或查抄IsCancellationRequested响应取消请求。
  • 合理使用Register可以处置惩罚取消时的回调逻辑。
通过灵活运用这些工具,你可以编写更高效、可控的异步程序。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表