ETAsyncTaskVoidMethodBuilder.cs 2.4 KB

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