using System; using System.Runtime.CompilerServices; using System.Security; namespace ETModel { public struct ETAsyncTaskVoidMethodBuilder { private Action moveNext; // 1. Static Create method. //[DebuggerHidden] public static ETAsyncTaskVoidMethodBuilder Create() { ETAsyncTaskVoidMethodBuilder builder = new ETAsyncTaskVoidMethodBuilder(); return builder; } // 2. TaskLike Task property(void) public ETTaskVoid Task => default; // 3. SetException //[DebuggerHidden] public void SetException(Exception exception) { } // 4. SetResult //[DebuggerHidden] public void SetResult() { // do nothing } // 5. AwaitOnCompleted //[DebuggerHidden] public void AwaitOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine { if (moveNext == null) { var runner = new MoveNextRunner(); moveNext = runner.Run; runner.StateMachine = stateMachine; // set after create delegate. } awaiter.OnCompleted(moveNext); } // 6. AwaitUnsafeOnCompleted //[DebuggerHidden] [SecuritySafeCritical] public void AwaitUnsafeOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine { if (moveNext == null) { var runner = new MoveNextRunner(); moveNext = runner.Run; runner.StateMachine = stateMachine; // set after create delegate. } awaiter.UnsafeOnCompleted(moveNext); } // 7. Start //[DebuggerHidden] public void Start(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine { stateMachine.MoveNext(); } // 8. SetStateMachine //[DebuggerHidden] public void SetStateMachine(IAsyncStateMachine stateMachine) { } } }