AsyncETVoidMethodBuilder.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System;
  2. using System.Diagnostics;
  3. using System.Runtime.CompilerServices;
  4. using System.Security;
  5. namespace ET
  6. {
  7. internal struct AsyncETVoidMethodBuilder
  8. {
  9. private IStateMachineWrap iStateMachineWrap;
  10. // 1. Static Create method.
  11. [DebuggerHidden]
  12. public static AsyncETVoidMethodBuilder Create()
  13. {
  14. AsyncETVoidMethodBuilder builder = new();
  15. return builder;
  16. }
  17. // 2. TaskLike Task property(void)
  18. [DebuggerHidden]
  19. public ETVoid Task => default;
  20. // 3. SetException
  21. [DebuggerHidden]
  22. public void SetException(Exception e)
  23. {
  24. if (this.iStateMachineWrap != null)
  25. {
  26. this.iStateMachineWrap.Recycle();
  27. this.iStateMachineWrap = null;
  28. }
  29. ETTask.ExceptionHandler.Invoke(e);
  30. }
  31. // 4. SetResult
  32. [DebuggerHidden]
  33. public void SetResult()
  34. {
  35. if (this.iStateMachineWrap != null)
  36. {
  37. this.iStateMachineWrap.Recycle();
  38. this.iStateMachineWrap = null;
  39. }
  40. }
  41. // 5. AwaitOnCompleted
  42. [DebuggerHidden]
  43. public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine
  44. {
  45. this.iStateMachineWrap ??= StateMachineWrap<TStateMachine>.Fetch(ref stateMachine);
  46. awaiter.OnCompleted(this.iStateMachineWrap.MoveNext);
  47. }
  48. // 6. AwaitUnsafeOnCompleted
  49. [DebuggerHidden]
  50. [SecuritySafeCritical]
  51. public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine
  52. {
  53. this.iStateMachineWrap ??= StateMachineWrap<TStateMachine>.Fetch(ref stateMachine);
  54. awaiter.UnsafeOnCompleted(this.iStateMachineWrap.MoveNext);
  55. }
  56. // 7. Start
  57. [DebuggerHidden]
  58. public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine
  59. {
  60. stateMachine.MoveNext();
  61. }
  62. // 8. SetStateMachine
  63. [DebuggerHidden]
  64. public void SetStateMachine(IAsyncStateMachine stateMachine)
  65. {
  66. }
  67. }
  68. }