具體用法如下所示。
private AsyncCallback callbackOnAccpt; //定制回調方法
private Socket s;
……
s=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
callbackAccpt = new AsyncCallback(this.OnAccept); //實例化回調方法
s.BeginAccept(callbackOnAccpt, this.s); //開始異步請求
……
private void OnAccept(IAsyncResult asynresult)
{
……
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);
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);
Socket中異步通信的實現要遠比同步困難,這裡不再舉例。簡單地說,在同步中,主線程如果調用一個方法,那麼主線程必須等到方法線程執行完才能繼續往下執行。因此,主線程和方法線程的執行是串行的。而在異步中,兩者能同時執行,它們的執行是並行的。