簡體   English   中英

異步/等待 vs 線程

[英]Async/Await vs Threads

在 .Net 4.5 中,Microsoft 添加了新的Async/Await功能以簡化異步編碼。 然而,我想知道

  1. Async/Await完全取代舊的Threads使用方式嗎?
  2. Async/Await能夠執行Thread可以異步執行的任何操作?
  3. Async/Await只能與WebClient.DownloadStringAsync等某些方法一起使用,或者我是否可以轉換任何同步方法以使其使用Async/Await而不會阻塞主線程?

它可以完全取代使用 Threads 的舊方式嗎?

不。一個線程可以做更多有用的事情。 Await 專門設計用於處理一些耗時的事情,最典型的是 I/O 請求。 傳統上,當 I/O 請求完成時,這是通過回調完成的。 編寫依賴這些回調的代碼非常困難,await 大大簡化了它。

能夠做任何一個線程可以異步做的事情?

大致。 Await 只負責處理延遲,否則它不會執行線程所做的任何事情。 await 關鍵字右側的 await表達式用於完成工作。 理想情況下,它根本不使用線程,它會發布一個驅動程序請求,一旦驅動程序完成數據傳輸,它就會生成一個完成通知回調。 網絡是迄今為止最常見的用途,數百毫秒的延遲很常見,並且是服務從桌面或 LAN 轉移到“雲”的不可避免的副作用。 同步使用此類服務​​會使 UI 完全沒有響應。

只能與某些方法一起使用,例如 WebClient.DownloadStringAsync

不可以。您可以將它與任何返回任務的方法一起使用。 XxxxAsync() 方法只是 .NET 框架中的預制方法,用於需要時間的常見操作。 就像從 Web 服務器下載數據一樣。

官方就此發表聲明。 盡管在盲目地將一件事替換為另一件事之前,您應該了解線程和異步編程之間的區別。

我是這樣考慮的(如果您查看https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110) )#線程)

Async/await 是一種在主應用程序線程上運行一些代碼的快速方法,其優點是代碼可以在沒有工作時掛起自己並將焦點返回到主線程,當有工作時在主線程上“喚醒”是要獲得的結果,然后將處理傳遞回 - 你猜對了 - 主線程。 可以把它想象成 Basic 中基於事件的 GOTO 語句,可以將控制權來回傳遞給特定的執行行。

相比之下,線程是一個單獨的執行流,可以使用它自己的變量等運行。其中 - 給定足夠的硬件 - 執行與主線程並行發生。

如果您有一個 GUI 應用程序要下載單個文件,然后在下載該文件時對該文件執行某些操作 - 我將使用 async/await 方法實現它。

但是,如果您的 GUI 需要下載 5000 個文件 - 我會創建一個文件下載線程來處理該問題,因為在轉移執行以處理下載文件時,主 GUI 線程可能會凍結。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM