c# 非同步( Async ) 不是多線程 c# 非同步( Async ) 不是多線程 誤解 async 在調試 xxxxAsync() 方法的時候,常常會看到調試器界面中會多出一些線程,直覺上誤認為 Async 冠名的函數是多線程。 對於 StringReader 中的 ReadAsync() 方法的 ...
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 完成時,會將在寄存器上做標記。
非同步的程式原理 非同步是將程式分成幾個部分,每部分由一個狀態控制,最後形成一個有限狀態機。