C#中的CancellationTokenSource

  1. CancellationTokenSource用于取消基于Task建立的线程(单个线程、多个线程都可以)。
  2. 定时取消也是可以的。
  3. 可以通过合并多个cts,达到其中一个任务取消,则任务全部取消的效果。

参考资料:

https://www.cnblogs.com/majiang/p/7920102.html(目前还看不懂)

https://www.cnblogs.com/luohengstudy/p/5623451.html

以下是本人调试时的代码:

代码1:


  
  
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace 取消单个任务
  8. {
  9. class Program
  10. {
  11. //声明CancellationTokenSource对象
  12. static CancellationTokenSource cts = new CancellationTokenSource();
  13. static void Main(string[] args)
  14. {
  15. Console.WriteLine( "==========取消单个任务==========");
  16. //将cts.Token传入任务中,在外部通过控制cts实现对任务的控制
  17. Task.Factory.StartNew(MyTask, cts.Token);
  18. Console.WriteLine( "请按回车键停止");
  19. Console.ReadLine();
  20. cts.Cancel(); //传达取消请求
  21. Console.WriteLine( "已停止");
  22. Console.ReadLine();
  23. }
  24. static void MyTask()
  25. {
  26. //判断任务是否取消,如果取消则跳出本次循环
  27. while (!cts.IsCancellationRequested)
  28. {
  29. Console.WriteLine( "当前时间:" + DateTime.Now.ToString( "yyyy-MM-dd HH:mm:ss.fff"));
  30. Thread.Sleep( 1000);
  31. }
  32. }
  33. }
  34. /*
  35. * 注:
  36. * 还可以计时取消任务。当一个任务超过了我们所设定的时间后自动取消该任务的执行。
  37. * 有两种方式实现(.net4.5以上):
  38. * 方式1:
  39. * var cts = new CancelTokenSource(3000);
  40. * 方式2:
  41. * cts.CancelAfter(3000);
  42. *
  43. * */
  44. }

执行结果:

代码2:


  
  
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace 取消多个任务
  8. {
  9. class Program
  10. {
  11. //在有多个CancellationTokenSource需要并行管理时,比如任意一个任务取消就取消所有任务时,我们不必一个一个去取消。
  12. //可以把并行的CancellationTokenSource组合在一起,一并管理。
  13. //定义需要一并管理的cts
  14. static CancellationTokenSource cts1 = new CancellationTokenSource();
  15. static CancellationTokenSource cts2 = new CancellationTokenSource();
  16. static CancellationTokenSource cts3 = new CancellationTokenSource();
  17. //创建一个将在任何源处于取消状态时处于取消状态的cts
  18. static CancellationTokenSource ctsCombine = CancellationTokenSource.CreateLinkedTokenSource(cts1.Token, cts2.Token, cts3.Token);
  19. static void Main(string[] args)
  20. {
  21. Console.WriteLine( "==========取消多个任务==========");
  22. Task.Factory.StartNew(MyTask1, ctsCombine.Token);
  23. Task.Factory.StartNew(MyTask2, ctsCombine.Token);
  24. Task.Factory.StartNew(MyTask3, ctsCombine.Token);
  25. Console.WriteLine( "按回车键执行cts1.Cancel()");
  26. Console.ReadLine();
  27. cts1.Cancel();
  28. Console.ReadLine();
  29. }
  30. static void MyTask1()
  31. {
  32. while (!ctsCombine.IsCancellationRequested)
  33. {
  34. Console.WriteLine( "MyTask1:" + DateTime.Now);
  35. Thread.Sleep( 1000);
  36. }
  37. Console.WriteLine( "MyTask1已跳出循环");
  38. }
  39. static void MyTask2()
  40. {
  41. while (!ctsCombine.IsCancellationRequested)
  42. {
  43. Console.WriteLine( "MyTask2:" + DateTime.Now);
  44. Thread.Sleep( 1000);
  45. }
  46. Console.WriteLine( "MyTask2已跳出循环");
  47. }
  48. static void MyTask3()
  49. {
  50. while (!ctsCombine.IsCancellationRequested)
  51. {
  52. Console.WriteLine( "MyTask3:" + DateTime.Now);
  53. Thread.Sleep( 1000);
  54. }
  55. Console.WriteLine( "MyTask3已跳出循环");
  56. }
  57. }
  58. }

执行结果:

发布了14 篇原创文章 · 获赞 5 · 访问量 6018
  1. CancellationTokenSource用于取消基于Task建立的线程(单个线程、多个线程都可以)。
  2. 定时取消也是可以的。
  3. 可以通过合并多个cts,达到其中一个任务取消,则任务全部取消的效果。

参考资料:

猜你喜欢

转载自blog.csdn.net/weixin_43277501/article/details/104516191
今日推荐