2012-10-08 16 views
12

を私はのawait +タスク使用時にUIがブロックされている理由を、私は理解していない:WPF 4.5アプリケーションで、私の非同期タスクが常にブロックUI

private async void Button_Click(object sender, RoutedEventArgs e) 
    { 
     // Task.Delay works great 
     //await Task.Delay(5000); 

     double value = await JobAsync(25.0); 

     MessageBox.Show("finished : " + value.ToString()); 
    } 

    private async Task<double> JobAsync(double value) 
    { 
     for (int i = 0; i < 30000000; i++) 
      value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); 

     return value; 
    } 

ザ・はTask.Delayは素晴らしい作品待つのが、 JobAsyncがUIをブロックするのを待つ。どうして ? ありがとうございます。

答えて

9

はこれを試してみてください:

private Task<double> JobAsync(double value) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     for (int i = 0; i < 30000000; i++) 
      value += Math.Log(Math.Sqrt(Math.Pow(value, 0.75))); 

     return value; 
    }); 
} 
+2

ではなくメソッドの内部で作業を開始することは、より多くのを作るかもしれません最終的な結果(関数が決して再利用されない場合)は同じですが、 'await'を使って' Task.Run'呼び出しを行に追加することができます。 – Servy

+2

同様のシナリオでも、UIスレッドはブロックされます。明らかな問題がありますか? – IbrarMumtaz

23

あなたはJobAsyncに関する警告を取得しなければならない - それは何のawait表現が含まれていません。 すべて作業はまだUIスレッドで行われています。このメソッドについては、実際には非同期はありません。

メソッドをasyncと指定しても、別のスレッドで実行されるわけではありません。非同期操作を一緒に結合して適切なコンテキストに戻すほうが簡単です。

私は戻って一歩を取ると、MSDNの非同期に関する資料の一部を吸収するために良いでしょう疑い... this is a good starting point ...

+0

ありがとう、私は今理解しています:) – Nico

関連する問題