国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

淺談C#網絡編程(二)

2019-11-14 13:57:42
字體:
來源:轉載
供稿:網友

閱讀目錄:

  1. 異步IO
  2. 非阻塞式同步IO
  3. 基于回調的異步IO并發

異步IO

上篇提到用多線程處理多個阻塞同步IO而實現并發服務端,這種模式在連接數量比較小的時候非常適合,一旦連接過多,性能會急速下降。 在大多數服務端網絡軟件中會采用一種異步IO的方式來提高性能。

  • 同步IO方式:連接Receive請求->等待->等待->接收成功
  • 異步IO方式:連接Receive請求->立即返回->事件或回調通知

采用異步IO方式,意味著單線程可以處理多個請求了,連接發起一個Receive請求后,當前線程可以立即去做別的事情,當數據接收完畢通知線程處理即可。
其數據接收分2部分:

  1. 數據從別的機器發送內核緩沖區
  2. 內核緩沖區拷貝到用戶緩沖區

第二部分示例代碼:

byte[] msg = new byte[256]; socket.Receive(msg);

介紹這2部分的目的是方便區分其他幾種方式。 對于用戶程序來說,同步IO和異步IO的區別在于第二部分是否需要等待。

非阻塞式同步IO

非阻塞式同步IO,由同步IO延伸出來,把這個名詞拆分成2部分描述:

  1. 非阻塞式,指的是上節"數據從別的機器發送內核緩沖區"部分是非阻塞的。
  2. 同步IO,指的是上節"內核緩沖區拷貝到用戶緩沖區"部分是等待的。

既然是第一部分是非阻塞的,那就需要一種方法得知什么時候內核緩沖區是OK的。 設置非阻塞模式后,在連接調用Receive方法時,會立即返回一個標記,告知用戶程序內核緩存區有沒有數據,如果有數據開始進行第二部分操作,從內核緩沖區拷貝到用戶程序緩沖區。 由于系統會返回個標記,那可以通過輪詢方式來判斷內核緩沖區是否OK。

設置非阻塞模式參考代碼:

SocketInformation sif=new SocketInformation();sif.Options=SocketInformationOptions.NonBlocking;sif.PRotocolInformation = new byte[24];Socket socket = new Socket(sif);

輪詢參考代碼:

while(true) {byte[] msg = new byte[256];var temp = socket.Receive(msg);if (temp=="OK"){//do something}else{ continue }}

 這種方式近乎淘汰了,了解即可。

基于回調的異步IO

上面介紹過:

  • 異步IO方式:連接Receive請求->立即返回->事件或回調通知

當回調到執行時,數據已經在用戶程序緩沖區已經準備好了,在回調代碼中對這部分數據進行相應的邏輯即可。

發出接收請求:

 static byte[] msg = new byte[256]; var temp = socket.BeginReceive(msg, 0, msg.Length, 0, new AsyncCallback(ReadCallback), socket);

回調函數中對數據做處理:

public static void ReadCallback(IAsyncResult ar) { var socket = (Socket)ar.AsyncState; int read = socket.EndReceive(ar);DoSomething(msg); socket.BeginReceive(msg, 0, msg.Length, 0, new AsyncCallback(Read_Callback), socket);}

 當回調函數執行時,表示數據已經準備好,需要先結束接收請求EndReceive,以便第二次發出接收請求。 在服務端程序中要處理多個客戶端的接收,再次發出BeginReceive接收數據請求即可。

這里的回調函數是在另外一個線程的觸發,必要時要對數據加鎖防止數據競爭:

Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邵东县| 汝南县| 德格县| 泸定县| 阿尔山市| 柘荣县| 福海县| 会同县| 巴林右旗| 兴隆县| 榆社县| 仙游县| 嵊泗县| 大厂| 金山区| 大名县| 广灵县| 射阳县| 朝阳县| 长白| 营山县| 乃东县| 五河县| 香格里拉县| 娱乐| 黎城县| 安远县| 盐亭县| 巴塘县| 昭苏县| 腾冲县| 新宁县| 临澧县| 昆明市| 海丰县| 襄汾县| 浙江省| 鄂州市| 申扎县| 保山市| 湘潭县|