-1

最近、C# の新機能である非同期プログラミング用の async/await キーワードについて学ぼうとしています。私がウェブで検索したとき、私はこの例に直面しました:

    static void Main(string[] args)
    {
        Console.WriteLine("Task based APM demo");

        // Call Exponnent() asynchronously.
        // And immediately return the control flow.
        // If I don't put a Task here, the program will sometimes
        // terminate immediately.
        Task t = new Task(async () =>
        {
            int result = await Program.Exponent(10);

            // After the operation is completed, the control flow will go here.
            Console.WriteLine(result);
        });

        t.Start();
        Console.ReadKey();
    }

    static async Task<int> Exponent(int n)
    {
        Console.WriteLine("Task started");
        return await TaskEx.Run<int>(() => 2 << (n - 1));
    }
}

それについて、またこの声明がどのように機能するかについて質問があります。最初に、その時点でプロセスを解放して呼び出し元のコンテキストに戻りたいときに使用される await 式を理解しています。しかし、なぜこの式は Exponent メソッドが呼び出した行でこれを使用したのでしょうか? 実際、コンパイラがこのプログラム行に直面するとどうなるでしょうか? そして、手紙の質問は、なぜプログラムは Exponent メソッドの本体で結果を返すために "TaskEx.Run" を使用するのですか? 「return await (() => 2 << (n - 1));」を使用することは可能ですか? それだけ?コンパイラはこの行でどのように動作しますか?

前もって感謝します

4

1 に答える 1

1

しかし、なぜこの式は、指数がそれを呼び出した行でこれを使用したのですか?

この質問の意味がわかりません。 await Task.Run<int>(() => 2 << (n - 1));タスクが完了するまで現在のメソッドの実行を一時停止するようにコンパイラーに指示します。タスクに関しては、これは次のようになります。

Task.Run<int>(() => 2 << (n - 1)).ContinueWith(t=>return t.Result);

returnしかし、もちろん、継続からはできません。このasyncキーワードは、メソッドに1つ以上のawait演算子が含まれる可能性があることをコンパイラーに通知するだけでなく、非同期操作の開始と復帰のさまざまな状態遷移を管理するステートマシンをセットアップします。同様に、これは、呼び出し元に対して非同期であることに関連して、メソッドがどのように実行されるかに影響を与える可能性があります。

Task使用される:でメソッドを呼び出すMainことはできないので、演算子を使用するためにが使用されていると思います。しかし、それは冗長なようです。私はおそらく単に別の方法を使用する必要があります:awaitMainTaskawaitawait

    static async void Method()
    {
        Console.WriteLine(await Exponent(10));
    }

次に書き直しますMain

    static void Main(string[] args)
    {
        Method();
        Console.ReadLine();
    }

しかし、コードが元々そのように書かれた理由や、本当の目的があったとしても、その理由はわかりません。

「returnawait(()=> 2 <<(n-1));」を使用することは可能ですか?

非同期が実行されていないため、このコード行を記述できません。 どちらも、メソッドが関連付けられて() => 2 << (n - 1)いないTaskオブジェクトを返しません。GetAwaiterしたがって、非同期で実行できます。したがって、それを「待つ」ことはできません。

于 2012-09-22T13:25:28.603 に答える