Task——取消任务

作者:追风剑情 发布于:2017-10-6 20:15 分类:C#

示例:用一个CancellationTokenSource取消Task

  1. using System;
  2. using System.Threading;
  3. using System.Threading.Tasks;
  4.  
  5. namespace TaskTest1
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. CancellationTokenSource cts = new CancellationTokenSource();
  12. //调用静态Run方法会自动创建Task对象并立即调用Start
  13. //如果一个任务还没开始就试图取消它,会抛出一个InvalidOperationException
  14. Task<Int32> t = Task.Run(()=>Sum(cts.Token, 1000000000), cts.Token);
  15. //在之后的某个时间,取消CancellationTokenSource以取消Task
  16. //这是异步请求,Task可能已经完成了
  17. cts.Cancel();
  18.  
  19. try
  20. {
  21. //Result属性内部会调用Wait
  22. //如果任务已取消,Result会抛出一个AggregateException
  23. Console.WriteLine("The sum is: "+t.Result);//一个Int32值
  24. }catch(AggregateException x){
  25. //将任何OperationCanceledException对象都视为已处理
  26. //其他任何异常都造成抛出一个新的AggregateException
  27. //其中只包含未处理的异常
  28. x.Handle(e=>e is OperationCanceledException);
  29. //所有异常都处理好之后,执行下面这一行
  30. Console.WriteLine("Sum was canceled");
  31. }
  32.  
  33. Console.ReadLine();
  34. }
  35.  
  36. private static Int32 Sum(CancellationToken ct, Int32 n)
  37. {
  38. Int32 sum = 0;
  39. for (; n > 0; n--)
  40. {
  41. //在取消标志引用的CancellationTokenSource上调用Cancel,
  42. //下面这行代码就会抛出OperationCanceledException
  43. ct.ThrowIfCancellationRequested();
  44.  
  45. //如果n太大,会抛出System.OverflowException
  46. checked { sum += n; }
  47. }
  48. return sum;
  49. }
  50. }
  51. }

运行测试

11111.png

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号