21

これら 2 つの方法の違いは何ですか?

    async private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        Thread.Sleep(2000);
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        Thread.Sleep(2000);
    }

どちらも私の UI をブロックします。ブロックを避けるために別のスレッドを開始する必要があることはわかっていますが、次のことがわかりました。

「非同期メソッドは、呼び出し元のスレッドをブロックすることなく、潜在的に長時間実行される作業を行うための便利な方法を提供します」.

私は少し混乱しています。

4

3 に答える 3

36

を追加するasyncだけでは、メソッド本体でawaitキーワードを使用できるようになるだけです。適切に実装された async メソッドは UI スレッドをブロックしませんが、不適切に実装されたものは確実にブロックされます。

あなたがおそらくやりたかったことはこれでした:

async private void Button_Click_1(object sender, RoutedEventArgs e)
{
    await Task.Delay(2000);
    MessageBox.Show("All done!");
}
于 2013-07-01T14:19:03.457 に答える
11

asyncそれ自体では、非同期 (ノンブロッキング) メソッドの呼び出しは有効になりません。関数内
で使用する必要があります。awaitasync

この機能をよりよく理解するには、これを読む必要があります。

于 2013-07-01T14:17:01.217 に答える
1

1) 非同期キーの動作により、タイム スライスにより、ブロッキングなしでメソッドが非同期になります。非同期は、タスクの完了を待つように指示する await とともに存在する必要がありますが、それ以前のものはすべて実行されます。

async private void Button_Click_1(object sender, RoutedEventArgs e)
{
    var task = Task.Delay(1000);

    /*Do stuff*/

    await task;
}

2) スレッドをスリープ状態にするだけです。上記のコードは実行されず、スレッドがスリープ状態でタスクを終了した後にのみ実行されます。

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    Thread.Sleep(2000);
    /*Do stuff*/
}

msdn Asynchronous Programming with Async and Await をよく読んでください。

于 2013-07-01T14:24:16.857 に答える