ToB企服应用市场:ToB评测及商务社交产业平台

标题: C#中 Task 团结 CancellationTokenSource的妙用 [打印本页]

作者: tsx81429    时间: 2024-12-21 07:42
标题: C#中 Task 团结 CancellationTokenSource的妙用
在.NET中,CancellationTokenSourceCancellationTokenTask是处置惩罚异步操纵和取消任务的紧张工具。本文将通过一些简单的例子,帮助你理解它们的用法和协作方式。
CancellationTokenSource

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

示例
  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生成。
常用属性和方法

示例
  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. });
复制代码
小结

通过灵活运用这些工具,你可以编写更高效、可控的异步程序。

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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4