NetworkStream.EndRead(IAsyncResult) Метод

Определение

Обрабатывает завершение асинхронного чтения.Handles the end of an asynchronous read.

public:
 override int EndRead(IAsyncResult ^ asyncResult);
public override int EndRead (IAsyncResult asyncResult);
override this.EndRead : IAsyncResult -> int
Public Overrides Function EndRead (asyncResult As IAsyncResult) As Integer

Параметры

asyncResult
IAsyncResult

Объект IAsyncResult, который представляет асинхронный вызов.An IAsyncResult that represents an asynchronous call.

Возвращаемое значение

Int32

Число байтов, читаемых из объекта NetworkStream.The number of bytes read from the NetworkStream.

Исключения

Параметр asyncResult имеет значение null.The asyncResult parameter is null.

Основной объект Socket закрыт.The underlying Socket is closed.

-или--or- Произошла ошибка при обращении к сокету.An error occurred when accessing the socket.

Объект NetworkStream закрыт.The NetworkStream is closed.

Примеры

В следующем примере кода в myReadCallback BeginRead качестве метода обратного вызова предоставляется.In the following code example, myReadCallback is provided to BeginRead as the callback method. EndRead реализуется в myReadCallback для завершения асинхронного вызова чтения, запущенного BeginRead .EndRead is implemented in myReadCallback to complete the asynchronous read call started by BeginRead.

// Example of EndRead, DataAvailable and BeginRead.
static void myReadCallBack( IAsyncResult^ ar )
{
   NetworkStream^ myNetworkStream = safe_cast<NetworkStream^>(ar->AsyncState);
   array<Byte>^myReadBuffer = gcnew array<Byte>(1024);
   String^ myCompleteMessage = "";
   int numberOfBytesRead;
   numberOfBytesRead = myNetworkStream->EndRead( ar );
   myCompleteMessage = String::Concat( myCompleteMessage, Encoding::ASCII->GetString( myReadBuffer, 0, numberOfBytesRead ) );
   
   // message received may be larger than buffer size so loop through until you have it all.
   while ( myNetworkStream->DataAvailable )
   {
      AsyncCallback^ pasync = gcnew AsyncCallback( &myReadCallBack );
      myNetworkStream->BeginRead( myReadBuffer, 0, myReadBuffer->Length, pasync, myNetworkStream );
   }

   // Print out the received message to the console.
   Console::WriteLine( "You received the following message : {0}", myCompleteMessage );
}
// Example of EndRead, DataAvailable and BeginRead.

public static void myReadCallBack(IAsyncResult ar ){

    NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
    byte[] myReadBuffer = new byte[1024];
    String myCompleteMessage = "";
    int numberOfBytesRead;

    numberOfBytesRead = myNetworkStream.EndRead(ar);
    myCompleteMessage =
        String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));

    // message received may be larger than buffer size so loop through until you have it all.
    while(myNetworkStream.DataAvailable){
        
        myNetworkStream.BeginRead(myReadBuffer, 0, myReadBuffer.Length,
                                                   new AsyncCallback(NetworkStream_ASync_Send_Receive.myReadCallBack),
                                                   myNetworkStream);
    }

    // Print out the received message to the console.
    Console.WriteLine("You received the following message : " +
                                myCompleteMessage);
}

' Example of EndRead, DataAvailable and BeginRead.
Public Shared Sub myReadCallBack(ar As IAsyncResult)
   
   Dim myNetworkStream As NetworkStream = CType(ar.AsyncState, NetworkStream)
   Dim myReadBuffer(1024) As Byte
   Dim myCompleteMessage As [String] = ""
   Dim numberOfBytesRead As Integer
   
   numberOfBytesRead = myNetworkStream.EndRead(ar)
   myCompleteMessage = [String].Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead))
   
   ' message received may be larger than buffer size so loop through until you have it all.
   While myNetworkStream.DataAvailable
      
      myNetworkStream.BeginRead(myReadBuffer, 0, myReadBuffer.Length, New AsyncCallback(AddressOf NetworkStream_ASync_Send_Receive.myReadCallBack), myNetworkStream)
   End While
   
   
   ' Print out the received message to the console.
   Console.WriteLine(("You received the following message : " + myCompleteMessage))
End Sub

Комментарии

EndReadМетод завершает операцию асинхронного чтения, запущенную в BeginRead методе.The EndRead method completes the asynchronous read operation started in the BeginRead method.

Перед вызовом необходимо BeginRead создать метод обратного вызова, который реализует AsyncCallback делегат.Before calling BeginRead, you need to create a callback method that implements the AsyncCallback delegate. Этот метод обратного вызова выполняется в отдельном потоке и вызывается системой после BeginRead возврата.This callback method executes in a separate thread and is called by the system after BeginRead returns. Метод обратного вызова должен принять значение, IAsyncResult возвращенное BeginRead методом в качестве параметра.The callback method must accept the IAsyncResult returned from the BeginRead method as a parameter.

В методе обратного вызова вызовите AsyncState свойство объекта, IAsyncResult чтобы получить объект состояния, переданный в BeginRead метод.Within the callback method, call the AsyncState property of the IAsyncResult to obtain the state object passed to the BeginRead method. Извлеките получение NetworkStream из этого объекта состояния.Extract the receiving NetworkStream from this state object. После получения NetworkStream метода вызовите EndRead метод для успешного завершения операции чтения и возврата числа считанных байтов.After obtaining the NetworkStream, call the EndRead method to successfully complete the read operation and return the number of bytes read.

EndReadМетод блокируется до тех пор, пока данные не будут доступны.The EndRead method blocks until data is available. EndReadМетод считывает столько данных, сколько доступно вплоть до числа байтов, указанного в size параметре BeginRead метода.The EndRead method reads as much data as is available up to the number of bytes specified in the size parameter of the BeginRead method. Если удаленный узел завершает Socket соединение и получено все доступные данные, EndRead метод завершается немедленно и возвращает нулевые байты.If the remote host shuts down the Socket connection and all available data has been received, the EndRead method completes immediately and returns zero bytes.

Чтобы получить полученные данные, вызовите AsyncState свойство объекта IAsyncResult и извлеките буфер, содержащийся в результирующем объекте состояния.To obtain the received data, call the AsyncState property of the IAsyncResult, and extract the buffer contained in the resulting state object.

Примечание

При получении сообщения IOException Проверьте InnerException свойство, чтобы определить, вызвано ли оно SocketException .If you receive an IOException, check the InnerException property to determine if it was caused by a SocketException. Если это так, используйте ErrorCode свойство для получения конкретного кода ошибки и подробное описание ошибки см. в документации по коду ошибки API Windows Sockets версии 2 .If so, use the ErrorCode property to obtain the specific error code and refer to the Windows Sockets version 2 API error code documentation for a detailed description of the error.

Применяется к

См. также раздел