5

VS2012 フレームワーク 4.5 のフォームで async および await コマンドを使用しようとしています。私の非同期メソッド SlowMethodAsync は何も返しません。このコードは、コンソール アプリケーションで正常に機能することに注意してください。

private void button1_Click(object sender, EventArgs e)
{
    var task =  SlowMethodAsync();

    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine(i);
    }

    System.Threading.Tasks.TaskStatus status = task.Status;

     Console.WriteLine("Slow method result on Thread: {0}", task.Result);    //This line never executes
    Console.WriteLine("Main complete on {0}", Thread.CurrentThread.ManagedThreadId);
}

//Why is this method not returning anything?

static async Task<int> SlowMethodAsync()
{
    Console.WriteLine("Slow method started on Thread: {0}", Thread.CurrentThread.ManagedThreadId);

    await Task.Delay(2000);

    Console.WriteLine("Slow method complete on Thread: {0}", Thread.CurrentThread.ManagedThreadId);

    return 42;
}
4

1 に答える 1

6

デッドロックを引き起こしました。

Usingtask.Resultは UI スレッドをブロックします - によって返されたタスクが完了するまで完了できませんSlowMethodAsync

ただし、SlowMethodAsyncもともと UI スレッドでも同期コンテキストで起動していたため、その後の継続await UI スレッドで実行したいと考えています。

したがってResult、非同期メソッドが完了するまで完了できません...そして非同期メソッドは完了するまで完了できませんResult

代わりに、button1_Clickメソッドも非同期にしてから、次を使用する必要があります。

Console.WriteLine("Slow method result on Thread: {0}", await task); 

これがコンソール アプリで機能した理由は、SlowMethodAsyncメソッドに戻る特定の同期コンテキストがなかったため、「メイン」によってブロックされないスレッド プール スレッドで継続を実行できたからです。タスクを待機しているスレッド。

于 2013-03-28T19:36:35.557 に答える