Freigeben über


NetworkStream.EndRead-Methode

Behandelt das Ende eines asynchronen Lesevorgangs.

Namespace: System.Net.Sockets
Assembly: System (in system.dll)

Syntax

'Declaration
Public Overrides Function EndRead ( _
    asyncResult As IAsyncResult _
) As Integer
'Usage
Dim instance As NetworkStream
Dim asyncResult As IAsyncResult
Dim returnValue As Integer

returnValue = instance.EndRead(asyncResult)
public override int EndRead (
    IAsyncResult asyncResult
)
public:
virtual int EndRead (
    IAsyncResult^ asyncResult
) override
public int EndRead (
    IAsyncResult asyncResult
)
public override function EndRead (
    asyncResult : IAsyncResult
) : int

Parameter

  • asyncResult
    Ein IAsyncResult, das einen asynchronen Aufruf darstellt.

Rückgabewert

Die Anzahl der aus dem NetworkStream gelesenen Bytes.

Ausnahmen

Ausnahmetyp Bedingung

ArgumentException

asyncResult ist NULL (Nothing in Visual Basic).

IOException

Der zugrunde liegende Socket ist geschlossen.

- oder -

Fehler beim Zugriff auf den Socket. Weitere Informationen finden Sie im Abschnitt Hinweise.

ObjectDisposedException

Der NetworkStream ist geschlossen.

Hinweise

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

Sie müssen eine Rückrufmethode erstellen, die den AsyncCallback-Delegaten implementiert, bevor Sie BeginRead aufrufen können. Diese Rückrufmethode wird in einem eigenen Thread ausgeführt und vom System aufgerufen, nachdem BeginRead beendet wurde. Die Rückrufmethode muss das von der BeginRead-Methode zurückgegebene IAsyncResult als Parameter akzeptieren.

Rufen Sie in der Rückrufmethode die AsyncState-Eigenschaft von IAsyncResult auf, um das an die BeginRead-Methode übergebene Zustandsobjekt abzurufen. Extrahieren Sie den Empfangs-NetworkStream aus diesem Zustandsobjekt. Rufen Sie nach dem Abrufen des NetworkStream die EndRead-Methode auf, um den Lesevorgang erfolgreich abzuschließen und die Anzahl der gelesenen Bytes zurückzugeben.

Die EndRead-Methode wird blockiert, bis Daten verfügbar sind. Die EndRead-Methode liest alle verfügbaren Daten bis zu der im size-Parameter der BeginRead-Methode angegebenen Anzahl von Bytes. Wenn der Remotehost die Socket-Verbindung schließt und alle verfügbaren Daten empfangen wurden, wird die EndRead-Methode sofort abgeschlossen und gibt 0 (null) Bytes zurück.

Sie können die empfangenen Daten mit der AsyncState-Eigenschaft von IAsyncResult abrufen und den im resultierenden Zustandsobjekt enthaltenen Puffer extrahieren.

Hinweis

Wenn Sie eine IOException erhalten, überprüfen Sie die InnerException-Eigenschaft, um zu bestimmen, ob die Ausnahme von einer SocketException verursacht wurde. Verwenden Sie in diesem Fall die ErrorCode-Eigenschaft, um den spezifischen Fehlercode abzurufen. In MSDN finden Sie in der Dokumentation zu API-Fehlercodes unter Windows Sockets, Version 2, eine ausführliche Beschreibung des Fehlers.

Beispiel

Im folgenden Codebeispiel wird myReadCallback für BeginRead als Rückrufmethode bereitgestellt. EndRead wird in myReadCallback implementiert, um den asynchronen Lesevorgang abzuschließen, der von BeginRead gestartet wurde.

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 'myReadCallBack

'Entry point which delegates to C-style main Private Function
Public Overloads Shared Sub Main()
   Main(System.Environment.GetCommandLineArgs())
End Sub

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);
}
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 );
}
public static void MyReadCallBack(IAsyncResult ar)
{
    NetworkStream myNetworkStream = (NetworkStream)ar.get_AsyncState();
    ubyte myReadBuffer[] = new ubyte[1024];
    String myCompleteMessage = "";
    int numberOfBytesRead;

    numberOfBytesRead = myNetworkStream.EndRead(ar);
    myCompleteMessage = String.Concat(myCompleteMessage, 
        Encoding.get_ASCII().GetString(myReadBuffer, 0, numberOfBytesRead));
    // message received may be larger than buffer size so loop through
    // until you have it all.
    while (myNetworkStream.get_DataAvailable()) {
        myNetworkStream.BeginRead(myReadBuffer, 0,
            myReadBuffer.get_Length(),
            new AsyncCallback(NetworkStreamASyncSendReceive.MyReadCallBack),
            myNetworkStream);
    }
    // Print out the received message to the console.
    Console.WriteLine(("You received the following message : " 
        + myCompleteMessage));
} //MyReadCallBack

Plattformen

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0

Siehe auch

Referenz

NetworkStream-Klasse
NetworkStream-Member
System.Net.Sockets-Namespace
BeginRead