2013-03-01 290 views
68

在.Net 4.5中微軟增加了新的Async/Await功能來簡化異步編碼。不過,我不知道異步/等待與線程

  1. Async/Await完全替代使用 Threads的老路上?
  2. Async/Await能夠做任何異步Thread可以做 異步嗎?
  3. 可以Async/Await只能用於一些方法,如WebClient.DownloadStringAsync或我可以轉換任何同步方法,使其使用Async/Await而不是阻止主線程?
+2

線程和異步/等待是不相關的功能。你可以將它們合併,但你不必。 – dtb 2013-03-01 01:30:02

+1

我認爲Async/Await和'new Thread(()=> {Some Work})做同樣的事情。不是嗎? – 2013-03-01 01:34:14

+1

沒有。你的假設是不正確的。您可能會考慮[Task.Run](http://msdn.microsoft.com/en-us/library/hh195051.aspx)(TPL),它通常與Async/Await結合使用,但也是不相關的不必與它一起使用。 – dtb 2013-03-01 01:37:34

回答

50

它可以完全替代舊的使用線程的方式嗎?

不是。線程可以做更多有用的事情。等待是專門設計來處理需要時間,最典型的是I/O請求。傳統上在I/O請求完成時用回調完成。編寫依賴這些回調的代碼是非常困難的,等待大大簡化它。

能夠做任何一個線程可以異步執行的操作嗎?

粗略地。等待只是處理延遲,它不會做任何線程。等待表達式,await關鍵字的右邊是什麼使得工作完成。理想情況下,它根本不使用線程,它發佈驅動程序請求,一旦驅動程序完成數據傳輸,它將生成完成通知回調。網絡是迄今爲止最常見的用法,數百毫秒的延遲是常見的,並且是從桌面或局域網到「雲」的服務的不可避免的副作用。同步使用這些服務會使UI非常反應。

只能用一些方法,如WebClient.DownloadStringAsync

號你可以返回任務的任何方法,用它來使用。 XxxxAsync()方法在.NET框架中僅用於需要時間的常見操作。就像從網絡服務器下載數據一樣。

+4

在現代C#方面,在外部API上實現異步回調的最佳方法是什麼? – bonCodigo 2014-05-19 05:13:20

+4

在最後一段中介紹,使用任務。 – 2015-04-26 12:24:46

+0

我希望線程可以做的事情不能通過異步編程來完成。 – 2016-01-24 03:59:20

12

The official statement on this.雖然您應該先理解線程和異步編程之間的區別,然後再盲目地將其中一件事替換掉。

+0

這就像我讀過的關於線程和異步/等待的第一個資源,它清晰簡潔。 – 2015-01-07 17:19:17

+0

此答案只包含文檔的鏈接。由於鏈接可能會過時,答案可能會過時 - 甚至更糟 - 完全無用。我們鼓勵Stack的用戶將鏈接的相關部分直接發佈到他們的問題中。 – HimBromBeere 2018-02-19 15:52:12