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.

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

Дополнительно