2013-10-01 2 views
5

スレッドを使用してUIのブロックを解除します。タスクを実行してユーザーインターフェイスをブロック解除します

あなたは、このコードの違いは何を教えてもらえ:

private async void button1_Click(object sender, EventArgs e) 
{ 
    int result = await Calculate(1, 2); 

    label1.Text = result.ToString(); 
} 

private async Task<int> Calculate(int number1, int number2) 
{ 
    return await Task.Run(() => 
    { 
     Thread.Sleep(5000); 
     return number1 + number2; 
    }); 
} 

そして、このコード:

private async void button1_Click(object sender, EventArgs e) 
{ 
    int result = await Calculate(1, 2); 

    label1.Text = result.ToString(); 
} 

private async Task<int> Calculate(int number1, int number2) 
{ 
    await Task.Delay(5000); 
    return number1 + number2; 
} 
+0

[Thread.SleepとTask.Delayの可能な複製?](http://stackoverflow.com/questions/17258428/thread-sleep-vs-task-delay) – Muctadir

答えて

2

を主な違いは、Task.Runは、新しいスレッドを作成することです(this MSDN documentationを参照してください。スレッドのセクション)。
ので、新しいスレッドが第二で

(一方、メインスレッドが使用可能であるので、戻りTask.Run(...)から呼び出し元に制御をバックアップ待つ)最初の場合には5秒間のブロックを作成し、結果を返します大文字と小文字の区別もありますが、待ってからコントロールが呼び出し元に転送され、Task.Delayがメインスレッドで実行されています。新しいスレッドは作成されません。

あなたがこの質問で言及したように、Task.Run()asyncおよびawaitを一緒に使用すると、マルチスレッド化に行きたい場合は、多くの可能性があります。

asyncおよびawait制御フローの詳細については、上記のドキュメントを参照してください。その非常に有用で詳細なMSDNを読む!

関連する問題