Freigeben über


NegotiateStream.EndRead(IAsyncResult) Methode

Definition

Beendet einen asynchronen Lesevorgang, der mit einem Aufruf von BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) gestartet wurde.

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

Eine IAsyncResult-Instanz, die durch einen Aufruf von BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) zurückgegeben wird.

Gibt zurück

Ein Int32-Wert, der die Anzahl von Bytes angibt, die aus dem zugrunde liegenden Stream gelesen werden.

Ausnahmen

asyncResult ist null.

asyncResult wurde nicht durch einen Aufruf von BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) erstellt.

Es ist kein ausstehender Lesevorgang vorhanden, der beendet werden muss.

- oder -

Es ist keine Authentifizierung erfolgt.

Fehler beim Lesevorgang.

Beispiele

Im folgenden Codebeispiel wird das Beenden eines asynchronen Lesevorgangs veranschaulicht. Ein Beispiel, das das Starten des Vorgangs veranschaulicht, finden Sie unter BeginRead.

static void EndReadCallback( IAsyncResult^ ar )
{
   
   // Get the saved data.
   ClientState^ cState = dynamic_cast<ClientState^>(ar->AsyncState);
   TcpClient^ clientRequest = cState->Client;
   NegotiateStream^ authStream = dynamic_cast<NegotiateStream^>(cState->AuthStream);
   
   // Get the buffer that stores the message sent by the client.
   int bytes = -1;
   
   // Read the client message.
   try
   {
      bytes = authStream->EndRead( ar );
      cState->Message->Append( Encoding::UTF8->GetChars( cState->Buffer, 0, bytes ) );
      if ( bytes != 0 )
      {
         authStream->BeginRead( cState->Buffer, 0, cState->Buffer->Length, gcnew AsyncCallback( EndReadCallback ), cState );
         return;
      }
   }
   catch ( Exception^ e ) 
   {
      
      // A real application should do something
      // useful here, such as logging the failure.
      Console::WriteLine( L"Client message exception:" );
      Console::WriteLine( e );
      cState->Waiter->Set();
      return;
   }

   IIdentity^ id = authStream->RemoteIdentity;
   Console::WriteLine( L"{0} says {1}", id->Name, cState->Message );
   cState->Waiter->Set();
}

private static void EndReadCallback(ClientState cState, int bytes)
{
    NegotiateStream authStream = (NegotiateStream)cState.AuthenticatedStream;
    // Read the client message.
    try
    {
        cState.Message.Append(Encoding.UTF8.GetChars(cState.Buffer, 0, bytes));
        if (bytes != 0)
        {
            Task<int> readTask = authStream.ReadAsync(cState.Buffer, 0, cState.Buffer.Length);
            readTask
                .ContinueWith(task => { EndReadCallback(cState, task.Result); })
                .Wait();

            return;
        }
    }
    catch (Exception e)
    {
        // A real application should do something
        // useful here, such as logging the failure.
        Console.WriteLine("Client message exception:");
        Console.WriteLine(e);
        return;
    }
    IIdentity id = authStream.RemoteIdentity;
    Console.WriteLine("{0} says {1}", id.Name, cState.Message.ToString());
}

Hinweise

Wenn der Vorgang nicht abgeschlossen wurde, blockiert diese Methode, bis dies geschieht.

Um diesen Vorgang synchron auszuführen, verwenden Sie die Read -Methode.

Sie können diese Methode erst aufrufen, wenn Sie sich erfolgreich authentifiziert haben. Rufen Sie zum Authentifizieren eine der AuthenticateAsClientMethoden , AuthenticateAsClientAsync, BeginAuthenticateAsClient, AuthenticateAsServer, oder BeginAuthenticateAsServerAuthenticateAsServerAsyncauf.

Gilt für: