2013-07-01 14 views
21

私は質問がありますが、これらの2つの方法の違いは何ですか?C#での非同期修飾子

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をブロックします。

"非同期メソッドは、呼び出し元のスレッドをブロックせずに長時間実行可能な作業を行う便利な方法を提供します"と私は気付いた。

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

+3

asyncを使うことができますが、 "await"を使用していることを確認してください。 –

+8

'async'メソッドのコンパイラ警告を知っていますか?それを読んで。何が間違っているか教えてくれます。 –

答えて

11

async単独では、非同期(非ブロッキング)メソッド呼び出しを有効にしません。
機能の中でawaitを使用する必要があります。

この機能をよりよく理解するには、thisとお読みください。

36

asyncを追加することは、方法本体にawaitキーワードを使用させること以外は何もしません。適切に実装された非同期メソッドはUIスレッドをブロックしませんが、不適切に実装された非同期メソッドは可能です。あなたはおそらくやりたいこと

は、このでした:

async private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    await Task.Delay(2000); 
    MessageBox.Show("All done!"); 
} 
1

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

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*/ 
} 

Theres a good read at msdn Asynchronous Programming with Async and Await

+2

あなたのタスクはそこでブロッキング待ちをしています。これは不必要にスレッドプールの時間を消費しています。 'Task.Delay'を使うことで、非同期オーバーシンクを使用するのではなく、すべてのものを適切に非同期にすることができます。 – Servy

+0

このコードは無効です... –

+0

ありがとうございます! =)今すぐ作業! – Fals