NetworkStream.EndRead(IAsyncResult) Methode

Definition

Behandelt das Ende eines asynchronen Lesevorgangs.

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

Parameter

asyncResult
IAsyncResult

Ein IAsyncResult, das einen asynchronen Aufruf darstellt.

Gibt zurück

Int32

Die Anzahl der aus dem NetworkStream gelesenen Bytes.

Ausnahmen

Der asyncResult-Parameter ist null.

Der zugrunde liegende Socket wird geschlossen.

- oder - Beim Zugreifen auf den Socket ist ein Fehler aufgetreten.

Der NetworkStream ist geschlossen.

Beispiele

Im folgenden Codebeispiel myReadCallback wird als Rückrufmethode bereitgestellt BeginRead . EndRead wird implementiert myReadCallback , um den asynchronen Leseaufruf abzuschließen, der von 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

Hinweise

Die EndRead Methode schließt den asynchronen Lesevorgang ab, der in der BeginRead Methode gestartet wurde.

Vor dem Aufrufen BeginReadmüssen Sie eine Rückrufmethode erstellen, die den AsyncCallback Delegaten implementiert. Diese Rückrufmethode wird in einem separaten Thread ausgeführt und nach rückgaben vom System BeginRead aufgerufen. Die Rückrufmethode muss die IAsyncResult zurückgegebene BeginRead Methode als Parameter akzeptieren.

Rufen Sie innerhalb der Rückrufmethode die AsyncState Eigenschaft des IAsyncResult an die BeginRead Methode übergebenen Statusobjekts auf. Extrahieren Sie den Empfang NetworkStream aus diesem Zustandsobjekt. Rufen Sie nach dem Abrufen der NetworkStreamMethode die EndRead Methode auf, um den Lesevorgang erfolgreich abzuschließen, und geben Sie die Anzahl der Lesebytes zurück.

Die EndRead Methode blockiert, bis Daten verfügbar sind. Die EndRead Methode liest so viele Daten wie verfügbar bis zur Anzahl der Bytes, die im size Parameter der BeginRead Methode angegeben sind. Wenn der Remotehost die Socket Verbindung heruntergefahren und alle verfügbaren Daten empfangen wurden, wird die EndRead Methode sofort abgeschlossen und gibt null Bytes zurück.

Rufen Sie zum Abrufen der empfangenen Daten die AsyncState Eigenschaft des IAsyncResultObjekts auf, und extrahieren Sie den Puffer, der im resultierenden Zustandsobjekt enthalten ist.

Hinweis

Wenn Sie eine IOException, überprüfen Sie die InnerException Eigenschaft, um zu ermitteln, ob sie durch eine SocketException. Wenn ja, verwenden Sie die ErrorCode Eigenschaft, um den spezifischen Fehlercode abzurufen und auf die Windows Sockets Version 2-API-Fehlercodedokumentation zu verweisen, um eine detaillierte Beschreibung des Fehlers zu erhalten.

Gilt für

Siehe auch