ETAsyncTaskVoidMethodBuilder.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.Diagnostics;
  3. using System.Runtime.CompilerServices;
  4. using System.Security;
  5. namespace ETModel
  6. {
  7. public struct ETAsyncTaskVoidMethodBuilder
  8. {
  9. private Action moveNext;
  10. // 1. Static Create method.
  11. [DebuggerHidden]
  12. public static ETAsyncTaskVoidMethodBuilder Create()
  13. {
  14. ETAsyncTaskVoidMethodBuilder builder = new ETAsyncTaskVoidMethodBuilder();
  15. return builder;
  16. }
  17. // 2. TaskLike Task property(void)
  18. public ETTaskVoid Task => default;
  19. // 3. SetException
  20. [DebuggerHidden]
  21. public void SetException(Exception exception)
  22. {
  23. }
  24. // 4. SetResult
  25. [DebuggerHidden]
  26. public void SetResult()
  27. {
  28. // do nothing
  29. }
  30. // 5. AwaitOnCompleted
  31. [DebuggerHidden]
  32. public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
  33. where TAwaiter : INotifyCompletion
  34. where TStateMachine : IAsyncStateMachine
  35. {
  36. if (moveNext == null)
  37. {
  38. var runner = new MoveNextRunner<TStateMachine>();
  39. moveNext = runner.Run;
  40. runner.StateMachine = stateMachine; // set after create delegate.
  41. }
  42. awaiter.OnCompleted(moveNext);
  43. }
  44. // 6. AwaitUnsafeOnCompleted
  45. [DebuggerHidden]
  46. [SecuritySafeCritical]
  47. public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
  48. where TAwaiter : ICriticalNotifyCompletion
  49. where TStateMachine : IAsyncStateMachine
  50. {
  51. if (moveNext == null)
  52. {
  53. var runner = new MoveNextRunner<TStateMachine>();
  54. moveNext = runner.Run;
  55. runner.StateMachine = stateMachine; // set after create delegate.
  56. }
  57. awaiter.UnsafeOnCompleted(moveNext);
  58. }
  59. // 7. Start
  60. [DebuggerHidden]
  61. public void Start<TStateMachine>(ref TStateMachine stateMachine)
  62. where TStateMachine : IAsyncStateMachine
  63. {
  64. stateMachine.MoveNext();
  65. }
  66. // 8. SetStateMachine
  67. [DebuggerHidden]
  68. public void SetStateMachine(IAsyncStateMachine stateMachine)
  69. {
  70. }
  71. }
  72. }