public void AwaitUnsafeOnCompleted <TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
            where TAwaiter : ICriticalNotifyCompletion
            where TStateMachine : IAsyncStateMachine
        {
            if (this.moveNext == null)
            {
                var runner = new MoveNextRunner <TStateMachine>();
                this.moveNext       = runner.Run;
                runner.StateMachine = stateMachine; // set after create delegate.
            }

            awaiter.UnsafeOnCompleted(this.moveNext);
        }
        public void AwaitOnCompleted <TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
            where TAwaiter : INotifyCompletion
            where TStateMachine : IAsyncStateMachine
        {
            if (this.moveNext == null)
            {
                if (this.tcs == null)
                {
                    this.tcs = new TaskCompletionSource(); // built future.
                }

                var runner = new MoveNextRunner <TStateMachine>();
                this.moveNext       = runner.Run;
                runner.StateMachine = stateMachine; // set after create delegate.
            }

            awaiter.OnCompleted(this.moveNext);
        }