2015-01-11 129 views
-4

我知道異步和線程是兩個非常不同的東西,第一個是開發異步行爲,而另一個是同步或並行功能。但是我剛纔注意到的一件事是,當目標是在長時間運行的任務期間保持應用程序響應並且活着時,使用Async和Await時,CPU的使用率會大大減少,並且像這樣使用舊線程:性能:異步vs線程

Thread Task1 = new Thread(()=>{ 

     // Do Something 
}); 

Thread Task2 = new Thread(()=>{ 
     Task1.Start(); 
     while(true){ 
     if (!Task1.IsAlive){ 
      // Do something 
      break; 
     } 
     Thread.Sleep(50); 
     } 
}); 

我只是想知道是否正常看到異步具有更高的性能,因爲我認爲同一個senario是在異步任務的後臺進行。在I約少5%的CPU使用率觀察到對異步做同樣的動作的性能測試應用

Thread.Sleep(50) -> thread 
await Task.Delay(50) -> Async 

:使用相同的延遲毫秒(50),用於兩者。

+2

你正在比較橙子蘋果。您需要澄清您的問題,因爲您的代碼示例執行兩個不同的操作。 –

+0

@YuvalItzchakov:沒有兩個代碼異步運行兩個任務,再看一遍。線程在運行其他任務之前等待Task 1完成。同樣在Async中完成,因爲它正在等待。但異步消耗較少的CPU。 – Ricky

+4

'Thread.Sleep'和'Task.Delay'不會做同樣的事情。 –

回答

0

從「保持應用程序響應」我的結論是你談論一些Windows程序。

在這種情況下,異步/等待將在與該程序的其餘部分相同的UI線程中運行。窗口調度器將按順序執行異步部分。 (繼續碼的異步操作後本身將在UI線程上運行)

在另一方面,backgorund工作者(線程)將並行,可能在另一個核心(現在)運行

無論如何,CPU使用率告訴你沒有什麼關於發生了什麼事情。

+3

「窗口調度程序將按順序執行異步部分」 - 這是不正確的。根據定義,異步操作不使用當前線程。另外,有些甚至不使用任何線程;他們只是利用現有的操作系​​統機制來允許獨立於進程中任何正在運行的線程來完成操作。您似乎將異步操作本身與繼續機制混淆了(即,在「await」語句完成後會發生什麼),其中延遲默認在UI線程中執行。 –

+0

我改進了我的答案 – DrKoch