Поделиться через


NegotiateStream.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

Расположение (начиная с 0) в массиве, заданном параметром buffer, с которого начинается сохранение данных, считанных из этого потока.

count
Int32

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

asyncCallback
AsyncCallback

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

asyncState
Object

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

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

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

Исключения

buffer имеет значение null.

Значение параметраoffset меньше 0.

-или-

Значение offset превышает длину buffer.

-или-

Сумма значений offset и count превышает длину массива buffer.

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

-или-

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

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

Объект закрыт.

Проверка подлинности не выполнялась.

Примеры

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

static void AuthenticateClient( TcpClient^ clientRequest )
{
   NetworkStream^ stream = clientRequest->GetStream();
   
   // Create the NegotiateStream.
   NegotiateStream^ authStream = gcnew NegotiateStream( stream,false );
   
   // Save the current client and NegotiateStream instance 
   // in a ClientState object.
   ClientState^ cState = gcnew ClientState( authStream,clientRequest );
   
   // Listen for the client authentication request.
   authStream->BeginAuthenticateAsServer( gcnew AsyncCallback( EndAuthenticateCallback ), cState );
   
   // Wait until the authentication completes.
   cState->Waiter->WaitOne();
   cState->Waiter->Reset();
   authStream->BeginRead( cState->Buffer, 0, cState->Buffer->Length, gcnew AsyncCallback( EndReadCallback ), cState );
   cState->Waiter->WaitOne();
   
   // Finished with the current client.
   authStream->Close();
   clientRequest->Close();
}


public static void AuthenticateClient(TcpClient clientRequest)
{
    NetworkStream stream = clientRequest.GetStream();
    // Create the NegotiateStream.
    NegotiateStream authStream = new NegotiateStream(stream, false);
    // Save the current client and NegotiateStream instance
    // in a ClientState object.
    ClientState cState = new ClientState(authStream, clientRequest);
    // Listen for the client authentication request.
    Task authTask = authStream
        .AuthenticateAsServerAsync()
        .ContinueWith(task => { EndAuthenticateCallback(cState); });

    // Any exceptions that occurred during authentication are
    // thrown by the EndAuthenticateAsServer method.
    try
    {
        // This call blocks until the authentication is complete.
        authTask.Wait();
    }
    catch (AuthenticationException e)
    {
        Console.WriteLine(e);
        Console.WriteLine("Authentication failed - closing connection.");
        return;
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        Console.WriteLine("Closing connection.");
        return;
    }

    Task<int> readTask = authStream
        .ReadAsync(cState.Buffer, 0, cState.Buffer.Length);

    readTask
        .ContinueWith((task) => { EndReadCallback(cState, task.Result); })
        .Wait();
    // Finished with the current client.
    authStream.Close();
    clientRequest.Close();
}

Комментарии

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

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

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

Класс NegotiateStream не поддерживает несколько одновременных операций чтения. При попытке запустить операцию чтения в то время как другая операция чтения уже выполняется в том же потоке, NotSupportedException возникнет исключение.

Вы не сможете вызвать этот метод, пока не пройдете проверку подлинности. Для проверки подлинности AuthenticateAsClientвызовите один из методов , BeginAuthenticateAsClientAuthenticateAsClientAsync, AuthenticateAsServer, , AuthenticateAsServerAsyncили BeginAuthenticateAsServer .

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