SslStream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) Метод

Определение

Начинает асинхронную операцию чтения, которая считывает данные из потока и сохраняет ее в указанном массиве.

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);
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

Параметры

buffer
Byte[]

Byte Массив, получающий байты, считываемые из потока.

offset
Int32

Отсчитываемый от нуля расположение, с buffer которого начинается хранение данных из этого потока.

count
Int32

Максимальное число байтов для чтения из потока.

asyncCallback
AsyncCallback

Делегат AsyncCallback , ссылающийся на метод для вызова при завершении операции чтения.

asyncState
Object

Определяемый пользователем объект, содержащий сведения об операции чтения. Этот объект передается asyncCallback делегату после завершения операции.

Возвращаемое значение

Объект IAsyncResult , указывающий состояние асинхронной операции.

Исключения

buffer равно null.

offset меньше нуля.

–или–

offset больше длины buffer.

–или–

offset + число больше длины buffer.

Сбой операции чтения.

–или–

Шифрование используется, но не удалось расшифровать данные.

Операция чтения уже выполняется.

Этот объект был закрыт.

Проверка подлинности не произошла.

Примеры

В следующем примере кода демонстрируется запуск асинхронной операции чтения.

// 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

Следующий метод вызывается при завершении чтения.


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

Комментарии

Если шифрование и подпись включены, операция чтения считывает данные из базового потока, проверяет целостность данных и /или расшифровывает его. Асинхронная операция чтения должна быть завершена EndRead путем вызова метода. Как правило, метод вызывается делегатом asyncCallback .

Этот метод не блокируется во время завершения операции. Чтобы заблокировать операцию до завершения операции, используйте Read метод.

Подробные сведения об использовании асинхронной модели программирования см. в статье "Вызов синхронных методов асинхронно"

Класс SslStream не поддерживает несколько одновременных операций чтения.

Этот метод нельзя вызвать, пока не будет успешно выполнена проверка подлинности. Чтобы выполнить проверку подлинности, вызовите один из AuthenticateAsClientметодов или BeginAuthenticateAsClient, AuthenticateAsServerBeginAuthenticateAsServer

Применяется к