3

.NET 4.5 の async および await 機能を学習しようとしています。まず、ここに私のコードを示します。

    static async void Method()
    {
        await Task.Run(new Action(DoSomeProcess));
        Console.WriteLine("All Methods have been executed");
    }

    static void DoSomeProcess()
    {
        System.Threading.Thread.Sleep(3000);
    }

    static void Main(string[] args)
    {
        Method();
        //Console.WriteLine("Method Started");
        Console.ReadKey();
    }

このコードでは、コンソールに結果が表示されません。理由がわかりません。つまり、タスクは、ブロックされていない単なるスレッドではないということです。ただし、メイン メソッドで Console.WriteLine() のコメントを外すと、すべて正常に動作しているようです。

ここで何が起こっているのか誰か教えてもらえますか?

4

2 に答える 2

2

asyncおよびawaitキーワードを正しく使用する方法を学ぶには、少し学習曲線があります。

問題は、待っている人が誰も待っていないことです。 や などの他の詳細がSyncronizationContextありTaskます。

いくつかの記事を確認する必要があります: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

コンソールで async および await キーワードを使用するには、追加のコードが必要です: コンソール アプリの 'Main' メソッドで 'async' 修飾子を指定できないか、ユニット テストの Async Void メソッド呼び出しを待機しないか、ユニット テスト エクスプローラーが地下鉄アプリの非同期単体テストを表示する

私は通常、このアプローチを行います:

static void Main(string[] args)
{
    Console.WriteLine("HELLO WORLD");
    var t1 = Task.Factory.StartNew(new Func<Task>(async () => await Method()))
        .Unwrap();
    Console.WriteLine("STARTED");
    t1.Wait();
    Console.WriteLine("COMPLETED");
    Console.ReadKey();
}

static async Task Method()
{
    // this method is perfectly safe to use async / await keywords
    Console.WriteLine("BEFORE DELAY");
    await Task.Delay(1000);
    Console.WriteLine("AFTER DELAY");
}
于 2013-10-12T15:05:13.300 に答える