SslStream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) Método

Definição

Inicia uma operação de leitura assíncrona que lê dados do fluxo e os armazena no array especificado.

public:
 override IAsyncResult ^ BeginRead(cli::array <System::Byte> ^ buffer, int offset, int count, AsyncCallback ^ asyncCallback, System::Object ^ asyncState);
public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback asyncCallback, object asyncState);
override this.BeginRead : byte[] * int * int * AsyncCallback * obj -> IAsyncResult
Public Overrides Function BeginRead (buffer As Byte(), offset As Integer, count As Integer, asyncCallback As AsyncCallback, asyncState As Object) As IAsyncResult

Parâmetros

buffer
Byte[]

Um Byte array que recebe os bytes lidos do fluxo.

offset
Int32

A localização baseada em zero onde buffer começar a armazenar os dados lidos deste fluxo.

count
Int32

O número máximo de bytes a ler do fluxo.

asyncCallback
AsyncCallback

Um AsyncCallback delegado que faz referência ao método a invocar quando a operação de leitura estiver completa.

asyncState
Object

Um objeto definido pelo utilizador que contém informação sobre a operação de leitura. Este objeto é passado para o asyncCallback delegado quando a operação termina.

Devoluções

Um IAsyncResult objeto que indica o estado da operação assíncrona.

Exceções

buffer é null.

offset é inferior a zero.

-ou-

offset é maior do que o comprimento de buffer.

-ou-

offset + contagem é maior que o comprimento de buffer.

A operação de leitura falhou.

-ou-

A encriptação está em uso, mas os dados não puderam ser desencriptados.

Já está em curso uma operação de leitura.

Este objeto foi encerrado.

A autenticação não ocorreu.

Exemplos

O exemplo de código seguinte demonstra o início de uma operação de leitura assíncrona.

// readData and buffer holds the data read from the server.
// They is used by the ReadCallback method.
static StringBuilder readData = new StringBuilder();
static byte [] buffer = new byte[2048];
' readData and buffer holds the data read from the server.
' They is used by the ReadCallback method.
Shared readData As New StringBuilder()
Shared buffer As Byte() = New Byte(2048) {}
static void WriteCallback(IAsyncResult ar)
{
    SslStream stream = (SslStream) ar.AsyncState;
    try
    {
        Console.WriteLine("Writing data to the server.");
        stream.EndWrite(ar);
        // Asynchronously read a message from the server.
        stream.BeginRead(buffer, 0, buffer.Length,
            new AsyncCallback(ReadCallback),
            stream);
    }
    catch (Exception writeException)
    {
        e = writeException;
        complete = true;
        return;
    }
}
Shared Sub WriteCallback(ar As IAsyncResult)
    Dim stream = CType(ar.AsyncState, SslStream)
    Try
        Console.WriteLine("Writing data to the server.")
        stream.EndWrite(ar)
        ' Asynchronously read a message from the server.
        stream.BeginRead(buffer, 0, buffer.Length, New AsyncCallback(AddressOf ReadCallback), stream)
    Catch writeException As Exception
        e = writeException
        complete = True
        Return
    End Try
End Sub

O seguinte método é chamado quando a leitura termina.


static void ReadCallback(IAsyncResult ar)
{
    // Read the  message sent by the server.
    // The end of the message is signaled using the
    // "<EOF>" marker.
    SslStream stream = (SslStream) ar.AsyncState;
    int byteCount = -1;
    try
    {
        Console.WriteLine("Reading data from the server.");
        byteCount = stream.EndRead(ar);
        // Use Decoder class to convert from bytes to UTF8
        // in case a character spans two buffers.
        Decoder decoder = Encoding.UTF8.GetDecoder();
        char[] chars = new char[decoder.GetCharCount(buffer,0, byteCount)];
        decoder.GetChars(buffer, 0, byteCount, chars,0);
        readData.Append (chars);
        // Check for EOF or an empty message.
        if (readData.ToString().IndexOf("<EOF>") == -1 && byteCount != 0)
        {
            // We are not finished reading.
            // Asynchronously read more message data from  the server.
            stream.BeginRead(buffer, 0, buffer.Length,
                new AsyncCallback(ReadCallback),
                stream);
        }
        else
        {
            Console.WriteLine("Message from the server: {0}", readData.ToString());
        }
    }
    catch (Exception readException)
    {
        e = readException;
        complete = true;
        return;
    }
    complete = true;
}

Shared Sub ReadCallback(ar As IAsyncResult)
    ' Read the  message sent by the server.
    ' The end of the message is signaled using the
    ' "<EOF>" marker.
    Dim stream = CType(ar.AsyncState, SslStream)
    Dim byteCount As Integer
    Try
        Console.WriteLine("Reading data from the server.")
        byteCount = stream.EndRead(ar)
        ' Use Decoder class to convert from bytes to UTF8
        ' in case a character spans two buffers.
        Dim decoder As Decoder = Encoding.UTF8.GetDecoder()
        Dim chars = New Char(decoder.GetCharCount(buffer, 0, byteCount)) {}
        decoder.GetChars(buffer, 0, byteCount, chars, 0)
        readData.Append(chars)
        ' Check for EOF or an empty message.
        If readData.ToString().IndexOf("<EOF>") = -1 AndAlso byteCount <> 0 Then
            ' We are not finished reading.
            ' Asynchronously read more message data from  the server.
            stream.BeginRead(buffer, 0, buffer.Length, New AsyncCallback(AddressOf ReadCallback), stream)
        Else
            Console.WriteLine("Message from the server: {0}", readData.ToString())
        End If
    Catch readException As Exception
        e = readException
        complete = True
        Return
    End Try
    complete = True
End Sub

Observações

Se a encriptação e/ou assinatura estiverem ativadas, a operação de leitura lê os dados do fluxo subjacente, verifica a integridade dos dados e/ou desencripta-os. A operação de leitura assíncrona deve ser completada chamando o EndRead método. Normalmente, o método é invocado pelo asyncCallback delegado.

Este método não bloqueia enquanto a operação está concluída. Para bloquear até a operação terminar, use o Read método.

Para informações detalhadas sobre a utilização do modelo de programação assíncrona, veja Chamar Métodos Síncronos Assíncronos

A SslStream classe não suporta múltiplas operações de leitura simultâneas.

Não pode chamar este método até ter autenticado com sucesso. Para autenticar, chame um dos AuthenticateAsClient, ou BeginAuthenticateAsClient, AuthenticateAsServer, BeginAuthenticateAsServer métodos.

Aplica-se a