這篇文章主要為大家展示了“C#異步通信的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“C#異步通信的示例分析”這篇文章吧。
C#異步通信概念及應用的認識首先讓我們來看看:在網絡編程中運用Socket,常常需要長期監聽某個端口,以獲得Socket連接,進而執行相關操作。
但此時,主線程就會被阻塞,無法做其他事情。為了解決這類問題,Socket類中提供了一些支持異步操作的方法,如表17-10所示。
下表為Socket類中支持異步操作的方法
方 法 | 說 明 |
BeginAccept() | 開始一個異步請求,以創建一個新的Socket對象來接受傳入的連接請求 |
EndAccept() | 結束一個異步請求,以創建一個新的Socket對象來接受傳入的連接請求 |
BeginConnect() | 開始一個對遠程主機的異步請求 |
EndConnect() | 結束一個對遠程主機的異步請求 |
BeginDisconnect() | 開始異步請求從遠程主機斷開連接 |
EndDisconnect() | 結束從遠程主機斷開連接的異步請求 |
BeginReceive() | 開始從連接的Socket中異步接收數據 |
EndReceive() | 結束從連接的Socket中異步接收數據 |
BeginReceiveFrom() | 開始從指定網絡設備中異步接收數據 |
EndReceiveFrom() | 結束從指定網絡設備中異步接收數據 |
BeginSend() | 開始將數據異步發送到連接的Socket中 |
EndSend() | 結束數據的異步發送 |
BeginSendFile() | 開始將文件異步發送到連接的Socket中 |
EndSendFile() | 結束文件的異步發送 |
BeginSendTo() | 向特定的遠程主機異步發送數據 |
EndSendTo() | 結束對遠程主機數據的異步發送 |
從上表中可以看出,這些方法都是成對出現的。這些方法能避免網絡通信中的阻塞現象。這些方法的使用機制是在Begin開頭的方法中注冊一個回調函數,當對應的事件發生時,調用該回調函數,且在回調函數中調用對應的End開頭的方法。
下面以BeginAccept()和EndAccept()為例,說明異步方法的用法。BeginAccept()的聲明如下所示。
public IAsyncResult BeginAccept(AsynCallback callback, object state);
其中,***個參數是異步委托AsynCallb了ack,state包含此請求的狀態信息的對象。
EndAccept()方法具有三種重載形式,如下所示。
public Socket EndAccept(IAsyncResult asynresult); public Socket EndAccept(out byte[] buffer, IAsyncResult asynresult); public Socket EndAccept(out byte[] buffer, out int bytesTransferred, IAsyncResult asynresult,);
asynresult用于存儲此異步操作的狀態信息及任何用戶定義的數據;buffer表示需要傳輸的字節數據;
bytesTransferred表示已經傳輸的字節數。這里的out參數與ref的用法類似,均表示傳遞引用。它們的區別是ref是傳遞參數的地址,out是返回值。
具體用法如下所示。
private AsyncCallback callbackOnAccpt; //定制回調方法 private Socket s; …… //C#異步通信 s=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); callbackAccpt = new AsyncCallback(this.OnAccept);//實例化回調方法 s.BeginAccept(callbackOnAccpt, this.s); //開始異步請求 …… private void OnAccept(IAsyncResult asynresult) { //C#異步通信…… s.EndAccept(asynresult); //結束異步請求 …… }
BeginConnect()和EndConnect()用于對遠程主機的異步連接請求。BeginConnect()的聲明如下所示。
public IAsyncResult BeginConnect(EndPoint remoteEP, AsyncCallback callback, object state); public IAsyncResult BeginConnect(IPAddress address, int port,AsyncCallback requestedcallback,object state); public IAsyncResult BeginConnect(IPAddress[] address, int port,AsyncCallback requestedcallback,object state); //C#異步通信public IAsyncResult BeginConnect(string host,int port, AsyncCallback requestedcallback,object state);
它的每個重載形式均含有AsyncCallback參數,這是這類Begin開頭的方法的特點;remoteEP表示遠程主機的IP和端口。
EndConnect()的聲明如下所示。
public Socket EndConnect(IAsyncResult asynresult);
它的參數的意義和EndAccept()完全一致。
BeginSend()表示開始將數據異步發送到連接的Socket,它最常用的聲明如下所示。
public IAsyncResult BeginSend(byte[] buffer, int offset,int size,SocketFlags socketFlags, AsyncCallback callback,object state);
Buffer表示要發送的數據,offset表示buffer中發送數據的位置,size為發送字節數的大小,socketFlags指SocketFlags值的按位組合。
EndSend()的聲明如下所示。
public Socket EndSend(IAsyncResult asynresult);
BeginReceive()表示開始從連接的Socket中異步接收數據,它的常見聲明如下所示。
public IAsyncResult BeginReceive(byte[] buffer, int offset,int size,SocketFlags socketFlags, AsyncCallback callback,object state);
它的參數和BeginSend()是完全一致的,這里不再贅述。
EndReceive()的聲明如下所示。
public Socket EndReceive(IAsyncResult asynresult);
C#異步通信之Socket中異步通信的實現要遠比同步困難,這里不再舉例。簡單地說,在同步中,主線程如果調用一個方法,那么主線程必須等到方法線程執行完才能繼續往下執行。因此,主線程和方法線程的執行是串行的。而在異步中,兩者能同時執行,它們的執行是并行的。
以上是“C#異步通信的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。