public Task <int> DoSomethingAsync(int parameter)
        {
            var asyncTaskMethodBuilder = AsyncTaskMethodBuilder <int> .Create();

            DoSomethingAsyncStateMachine methodAsyncStateMachine = new DoSomethingAsyncStateMachine()
            {
                __parameter = parameter,
                __this      = this,
                __state     = -1,
                __builder   = asyncTaskMethodBuilder
            };

            asyncTaskMethodBuilder.Start(ref methodAsyncStateMachine);
            return(methodAsyncStateMachine.__builder.Task);
        }
        void IAsyncStateMachine.MoveNext()
        {
            try
            {
                // Wenn im initialen Status
                if (this.__state != 0)
                {
                    // Ausführen des synchronen Codes vor dem ersten await
                    this.__result = this.__this.SomeSynchronousMethod(
                        this.__parameter);

                    // Ausführen des asynchronen Codes
                    this.__taskAwaiter = this.__this.MyMethodAsync(
                        this.__parameter).GetAwaiter();

                    // Wenn der Task schon fertig ist; bleiben wir synchron und geben
                    // das Ergebnis zurück
                    // Ansonsten machen wir in dem folgenden Block weiter
                    if (!this.__taskAwaiter.IsCompleted)
                    {
                        this.__state = 0;
                        DoSomethingAsyncStateMachine stateMachine = this;

                        this.__builder.AwaitUnsafeOnCompleted(
                            ref this.__taskAwaiter, ref stateMachine);

                        return;
                    }
                }

                // Für weitere async Methoden werden hier weitere Stati definiert.
                // Die Stati werden dann positiv hochgezählt

                // Hier wird das Result aus dem Task geholt, der State auf
                // completed gesetzt und das Result zurück gegeben
                this.__result = this.__taskAwaiter.GetResult();
                this.__state  = -2;
                this.__builder.SetResult(__result);
            }
            catch (Exception exception)
            {
                // Exceptions werden hier gefangen und über den Builder an den
                // Aufrufer weiter gegeben
                this.__state = -2;
                this.__builder.SetException(exception);
            }
        }