TaskCompletionSource

作者:追风剑情 发布于:2023-8-4 15:07 分类:C#

  1. using System;
  2. using System.Threading.Tasks;
  3.  
  4. namespace ConsoleApp2
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. var sourceTask = DoSomthing();
  11. try
  12. {
  13. //当调用Result时,任务会挂起,直到完成后才返回
  14. Console.WriteLine("Async completed: {0}", sourceTask.Task.Result);
  15. }
  16. catch(AggregateException e)
  17. {
  18. //当任务取消或发生异常时会抛出AggregateException
  19. //e.Message: 发生一个或多个错误
  20. Console.WriteLine(e.Message);
  21. //e.InnerException.Message: 具体的错误原因描述在这里
  22. Console.WriteLine(e.InnerException.Message);
  23. }
  24. catch(Exception e)
  25. {
  26. Console.WriteLine(e.Message);
  27. }
  28.  
  29. Console.WriteLine("Main End");
  30. Console.Read();
  31. }
  32.  
  33. public static TaskCompletionSource<string> DoSomthing()
  34. {
  35. TaskCompletionSource<string> source = new TaskCompletionSource<string>();
  36. Task.Run(()=> {
  37. //暂停5秒
  38. Task delay = Task.Delay(5000);
  39. delay.Wait();
  40. //TaskCompletionSource完成
  41. //source.SetResult("Hello world!");
  42.  
  43. //取消任务,会向外部程序抛出 AggregateException
  44. //外部程序通过 aggregateException.InnerException.Message 打印报错消息
  45. //source.SetCanceled();
  46.  
  47. //设置异常,会向外部程序抛出 AggregateException
  48. //外部程序通过 aggregateException.InnerException.Message 打印自定义报错消息
  49. source.SetException(new Exception("my exception message"));
  50. });
  51. Console.WriteLine("DoSomthing() End");
  52. return source;
  53. }
  54. }
  55. }

运行测试

(1) 调用SetResult(),正常结束

1111.png

(2) 调用SetCanceled(),取消任务

22222.png

(3) 调用SetException(),发生异常

33333.png

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号