AsyncETVoidMethodBuilder.cs 2.4 KB

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