c# 異步( Async ) 不是多線程


c# 異步( Async ) 不是多線程
 
誤解 async
在調試 xxxxAsync() 方法的時候,常常會看到調試器界面中會多出一些線程,直覺上誤認為 Async 冠名的函數是多線程。 對於 StringReader 中的 ReadAsync() 方法的確如此,
ReadAsync() 在內部調用 Task.FromResult(),而 Task 正是微軟提供封裝完整的線程池。 但是對於 HttpClient 中的 GetStringAsyncCore() 則是由 async 修飾的異步函數。
由於多線程和異步函數都可能冠上 Async 因此,一開始容易誤以為 async 等於 異步。在多線程或異步函數上冠名 Async 則是一種默認的命名規范。

異步、多線程的區別
異步 : 屬於通信的范疇,在發出消息當下不等待對方回應,便開始繼續自己的任務。所以 c# 的很多 _異步_ 操作都在 io 、 socket 這些類庫下面,都是通信性質的類庫,
io 可以理解向系統內核發送文件數據
 
多線程 : 屬於計算范疇,通常是關於如果利用 cpu 的空閑時間進行計算。
異步同多線程可以完美的結合,服務器開啟多個線程監聽前端請求,接收處理完畢后,可以異步地將數據序列化到磁盤,當然如果需要知道序列化的結果則異步處理可以等待 ( await )。
從這個例子不難知道,多線程是提高數據的計算能力,而異步則是為了提高程序的吞吐量。

異步的硬件支持
計算機硬件需要依賴中斷來請求 cpu 進行計算,但是中斷需要存儲上下文而且耗費性能,不能頻繁中斷 cpu 。當進行 io 操作時,一般會在用戶態上進行緩存,
這時數據在內存上,接下來 cpu 切到系統態上,讓 Direct Memory Access (DMA) 完成數據傳輸,這時 cpu 完全不過問 io 操作,待 DMA 完成時,會將在寄存器上做標記。
異步的程序原理
異步是將程序分成幾個部分,每部分由一個狀態控制,最后形成一個有限狀態機。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM