結束掛起的異步讀取。
程序集: System(System.dll 中)
參數
- asyncResult
-
IAsyncResult,它存儲此異步操作的狀態信息以及所有用戶定義數據。
Exception | Condition |
---|---|
ArgumentNullException |
asyncResult 為 null。 |
ArgumentException |
BeginReceive 方法調用未返回 asyncResult。 |
InvalidOperationException |
先前曾為異步讀取調用過 EndReceive。 |
SocketException |
試圖訪問套接字時發生錯誤。有關更多信息,請參見備注部分。 |
ObjectDisposedException |
Socket 已關閉。 |
EndReceive 方法完成在 BeginReceive 方法中啟動的異步讀取操作。
在調用 BeginReceive 之前,需創建一個實現 AsyncCallback 委托的回調方法。該回調方法在單獨的線程中執行並在 BeginReceive 返回后由系統調用。回調方法必須接受 BeginReceive 方法所返回的 IAsyncResult 作為參數。
在回調方法中,調用 IAsyncResult 的 AsyncState 方法以獲取傳遞給 BeginReceive 方法的狀態對象。從該狀態對象提取接收 Socket。在獲取 Socket 之后,可以調用 EndReceive 方法以成功完成讀取操作,並返回已讀取的字節數。
EndReceive 方法將一直阻止到有數據可用為止。如果您使用的是無連接協議,則 EndReceive 將讀取傳入網絡緩沖區中第一個排隊的可用數據報。如果您使用的是面向連接的協議,則 EndReceive 方法將讀取所有可用的數據,直到達到 BeginReceive 方法的 size 參數所指定的字節數為止。如果遠程主機使用 Shutdown 方法關閉了 Socket 連接,並且所有可用數據均已收到,則 EndReceive 方法將立即完成並返回零字節。
若要獲取接收到的數據,請調用 IAsyncResult 的 AsyncState 方法,然后提取所產生的狀態對象中包含的緩沖區。
若要取消掛起的 BeginReceive,請調用 Close 方法。
![]() |
---|
如果收到 SocketException,請使用 SocketException.ErrorCode 屬性獲取特定的錯誤代碼。獲取此代碼后,您可以參考 MSDN Library 中的 Windows Sockets 第 2 版 API 錯誤代碼文檔,獲取有關該錯誤的詳細說明。 |
![]() |
---|
由給定線程啟動的所有 I/O 在該線程退出時均被取消。如果線程在操作完成前退出,掛起的異步操作則會失敗。 |
![]() |
---|
當應用程序中啟用了網絡跟蹤時,此成員將輸出跟蹤信息。有關詳細信息,請參閱 .NET Framework 中的網絡跟蹤。 |
下面的代碼示例結束掛起的異步讀取。有關演示與套接字異步通信的完整示例,請參見 Socket Code Examples。
public static void Read_Callback(IAsyncResult ar){ StateObject so = (StateObject) ar.AsyncState; Socket s = so.workSocket; int read = s.EndReceive(ar); if (read > 0) { so.sb.Append(Encoding.ASCII.GetString(so.buffer, 0, read)); s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, new AsyncCallback(Async_Send_Receive.Read_Callback), so); } else{ if (so.sb.Length > 1) { //All of the data has been read, so displays it to the console string strContent; strContent = so.sb.ToString(); Console.WriteLine(String.Format("Read {0} byte from socket" + "data = {1} ", strContent.Length, strContent)); } s.Close(); } }