SslStream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
- 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.