C#中的異步
異步的概念和同步相對。
異步,執行緒,並行.三個概念是不同的.
執行緒
執行緒是進程中某個單一順序的控制流。也被稱為輕量進程(lightweight processes).計算機科學術語,指運行中的程式的調度單位.
當一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。以CAsyncSocket類為例(注意,CSocket從CAsyncSocket派生,但是其功能已經由異步轉化為同步),當一個客戶端通過調用Connect函式發出一個連線請求後,調用者執行緒立刻可以朝下運行。當連線真正建立起來以後,socket底層會傳送一個訊息通知該對象。這裡提到執行部件和調用者通過三種途徑返回結果:狀態、通知和回調。可以使用哪一種依賴於執行部件的實現,除非執行部件提供多種選擇,否則不受調用者控制。如果執行部件用狀態來通知,那么調用者就需要每隔一定時間檢查一次,效率就很低(有些初學多執行緒編程的人,總喜歡用一個循環去檢查某個變數的值,這其實是一種很嚴重的錯誤)。如果是使用通知的方式,效率則很高,因為執行部件幾乎不需要做額外的操作。至於回調函式,其實和通知沒太多區別。
並行
一般指並行計算,是說同一時刻有多條指令同時被執行,這些指令可能執行於同一CPU的多核上,或者多個CPU上,或者多個物理主機甚至多個網路中.
異步
與同步相對應,異步指的是讓CPU暫時擱置當前請求的回響,處理下一個請求,當通過輪詢或其他方式得到回調通知後,開始運行。多執行緒將異步操作放入另一執行緒中運行,通過輪詢或回調方法得到完成通知,但是完成連線埠,由作業系統接管異步操作的調度,通過硬體中斷,在完成時觸發回調方法,此方式不需要占用額外執行緒。
C#異步與多執行緒的異同點
異步和多執行緒兩者都可以達到避免調用執行緒阻塞的目的,從而提高軟體的可回響性。
異步操作無須額外的執行緒負擔,並且使用回調的方式進行處理,在設計良好的情況下,處理函式可以不必使用共享變數(即使無法完全不用,最起碼可以減少 共享變數的數量),減少了死鎖的可能。當然異步操作也並非完美無暇。編寫異步操作的複雜程度較高,程式主要使用回調方式進行處理,與普通人的思維方式有些 出入,而且難以調試。當需要執行I/O操作時,使用異步操作比使用執行緒+同步 I/O操作更合適。
多執行緒中的處理程式依然是順序執行,符合普通人的思維習慣,所以編程簡單。但是多執行緒的缺點也同樣明顯,執行緒的使用(濫用)會給系統帶來上下文切換的額外負擔。並且執行緒間的共享變數可能造成死鎖的出現。多執行緒的適用範圍則是那種需要長時間CPU運算的場合,例如耗時較長的圖形處理和算法執行。
異步通信
簡介
在通信中,“異步通信”是一種很常用的通信方式。異步通信在傳送字元時,所傳送的字元之間的時間間隔可以是任意的。當然,接收端必須時刻做好接收的準備(如果接收端主機的電源都沒有加上,那么傳送端傳送字元就沒有意義,因為接收端根本無法接收)。傳送端可以在任意時刻開始傳送字元,因此必須在每一個字元的開始和結束的地方加上標誌,即加上開始位和停止位,以便使接收端能夠正確地將每一個字元接收下來。異步通信的好處是通信設備簡單、便宜,但傳輸效率較低(因為開始位和停止位的開銷所占比例較大)。
異步通信也可以是以幀作為傳送的單位。接收端必須隨時做好接收幀的準備。這時,幀的首部必須設有一些特殊的比特組合,使得接收端能夠找出一幀的開始。這也稱為幀定界。幀定界還包含確定幀的結束位置。這有兩種方法。一種是在幀的尾部設有某種特殊的比特組合來標誌幀的結束。或者在幀首部中設有幀長度的欄位。需要注意的是,在異步傳送幀時,並不是說傳送端對幀中的每一個字元都必須加上開始位和停止位後再傳送出去,而是說,傳送端可以在任意時間傳送一個幀,而幀與幀之間的時間間隔也可以是任意的。在一幀中的所有比特是連續傳送的。傳送端不需要在傳送一幀之前和接收端進行協調(不需要先進行比特同步)。
差錯類型
異步通信過程中,可能發生通信錯,一般有3種錯誤:
幀格式錯:在應該接收到停止位的時候,接收到邏輯的“0”,便產生幀格式錯誤。
奇偶錯:接收到的奇偶校驗位錯。
復蓋錯:通信接口接收到數據並存放到數據輸入暫存器中,但是CPU沒有及時來取,後面新接收的數據復蓋了前面收到的數據,叫做復蓋錯。
發生幀格式錯和奇偶錯的原因可能為下面幾種:
(1)傳送和接收雙方採用了不同的傳輸率,或雖然雙方約定了相同的傳輸率,但傳輸率不可能絕對相等。在通信的速率比較高的情況下,如果雙方的傳輸率誤差達到一定的程度,也會造成通信出錯;
(2)通信雙方採用了不相同的幀格式;
(3)干擾。