2013-10-01 58 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 vs Task.Delay?](http://stackoverflow.com/questions/17258428/thread-sleep-vs-task-delay) – Muctadir

回答

2

的主要區別在於Task.Run創建一個新的線程(指this MSDN documentation的主題部分)。
因此,新的線程在第一種情況下創建的塊爲5秒鐘,然後返回結果(此時,主線程可供使用,所以伺機返回從Task.Run(...)背控制給調用者)

在第二也是如此,在等待之後,控制權被轉移給調用者,並且Task.Delay正在主線程中進行。沒有新的線程被創建。

因此,如你所提到的問題,如果你想要去多線程,使用Task.Run()連同asyncawait會給你很多的可能性。

有關asyncawait控制流程的更多詳細信息,請參閱上述文檔。它是一個非常有用和詳細的MSDN閱讀!