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



















