AwaiterInterfaces.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /**
  2. * 来源:
  3. * https://github.com/walterlv/sharing-demo/blob/master/src/Walterlv.Core/Threading/AwaiterInterfaces.cs
  4. * 参考资料:
  5. * https://weblogs.asp.net/dixin/understanding-c-sharp-async-await-2-awaitable-awaiter-pattern
  6. * https://blog.walterlv.com/post/write-dispatcher-awaiter-for-ui.html#awaiter-%E7%B3%BB%E5%88%97%E6%96%87%E7%AB%A0
  7. *
  8. */
  9. using System.Runtime.CompilerServices;
  10. namespace Fort23.Core
  11. {
  12. #region 可以被await的接口
  13. /// <summary>
  14. /// 表示一个可等待对象,如果一个方法返回此类型的实例,则此方法可以使用 `await` 异步等待。
  15. /// </summary>
  16. /// <typeparam name="TAwaiter">用于给 await 确定返回时机的 IAwaiter 的实例。</typeparam>
  17. public interface IAwaitable<out TAwaiter> where TAwaiter : IAwaiter
  18. {
  19. /// <summary>
  20. /// 获取一个可用于 await 关键字异步等待的异步等待对象。
  21. /// 此方法会被编译器自动调用。
  22. /// </summary>
  23. TAwaiter GetAwaiter();
  24. }
  25. /// <summary>
  26. /// 表示一个包含返回值的可等待对象,如果一个方法返回此类型的实例,则此方法可以使用 `await` 异步等待返回值。
  27. /// </summary>
  28. /// <typeparam name="TAwaiter">用于给 await 确定返回时机的 IAwaiter{<typeparamref name="TResult"/>} 的实例。</typeparam>
  29. /// <typeparam name="TResult">异步返回的返回值类型。</typeparam>
  30. public interface IAwaitable<out TAwaiter, out TResult> where TAwaiter : IAwaiter<TResult>
  31. {
  32. /// <summary>
  33. /// 获取一个可用于 await 关键字异步等待的异步等待对象。
  34. /// 此方法会被编译器自动调用。
  35. /// </summary>
  36. TAwaiter GetAwaiter();
  37. }
  38. #endregion
  39. #region GetAwaiter()方法返回的类的接口定义
  40. /// <summary>
  41. /// 用于给 await 确定异步返回的时机。
  42. /// </summary>
  43. public interface IAwaiter : INotifyCompletion
  44. {
  45. /// <summary>
  46. /// 获取一个状态,该状态表示正在异步等待的操作已经完成(成功完成或发生了异常);此状态会被编译器自动调用。
  47. /// 在实现中,为了达到各种效果,可以灵活应用其值:可以始终为 true,或者始终为 false。
  48. /// </summary>
  49. bool IsCompleted { get; }
  50. /// <summary>
  51. /// 此方法会被编译器在 await 结束时自动调用以获取返回状态(包括异常)。
  52. /// </summary>
  53. void GetResult();
  54. }
  55. /// <summary>
  56. /// 当执行关键代码(此代码中的错误可能给应用程序中的其他状态造成负面影响)时,
  57. /// 用于给 await 确定异步返回的时机。
  58. /// </summary>
  59. public interface ICriticalAwaiter : IAwaiter, ICriticalNotifyCompletion
  60. {
  61. }
  62. /// <summary>
  63. /// 用于给 await 确定异步返回的时机,并获取到返回值。
  64. /// </summary>
  65. /// <typeparam name="TResult">异步返回的返回值类型。</typeparam>
  66. public interface IAwaiter<out TResult> : INotifyCompletion
  67. {
  68. /// <summary>
  69. /// 获取一个状态,该状态表示正在异步等待的操作已经完成(成功完成或发生了异常);此状态会被编译器自动调用。
  70. /// 在实现中,为了达到各种效果,可以灵活应用其值:可以始终为 true,或者始终为 false。
  71. /// </summary>
  72. bool IsCompleted { get; }
  73. /// <summary>
  74. /// 获取此异步等待操作的返回值,此方法会被编译器在 await 结束时自动调用以获取返回值(包括异常)。
  75. /// </summary>
  76. /// <returns>异步操作的返回值。</returns>
  77. TResult GetResult();
  78. }
  79. /// <summary>
  80. /// 当执行关键代码(此代码中的错误可能给应用程序中的其他状态造成负面影响)时,
  81. /// 用于给 await 确定异步返回的时机,并获取到返回值。
  82. /// </summary>
  83. /// <typeparam name="TResult">异步返回的返回值类型。</typeparam>
  84. public interface ICriticalAwaiter<out TResult> : IAwaiter<TResult>, ICriticalNotifyCompletion
  85. {
  86. }
  87. #endregion
  88. }