NegotiateStream.BeginWrite Метод

Определение

Начинает асинхронную операцию записи, которая записывает байты (Byte) из указанного буфера в поток.

public:
 override IAsyncResult ^ BeginWrite(cli::array <System::Byte> ^ buffer, int offset, int count, AsyncCallback ^ asyncCallback, System::Object ^ asyncState);
public override IAsyncResult BeginWrite (byte[] buffer, int offset, int count, AsyncCallback? asyncCallback, object? asyncState);
public override IAsyncResult BeginWrite (byte[] buffer, int offset, int count, AsyncCallback asyncCallback, object asyncState);
override this.BeginWrite : byte[] * int * int * AsyncCallback * obj -> IAsyncResult
Public Overrides Function BeginWrite (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

Значение Int32, определяющее количество байт, которые требуется считать из массива buffer.

asyncCallback
AsyncCallback

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

asyncState
Object

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

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

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

Исключения

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

offset is less than 0.

-или-

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

-или-

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

Не удалось выполнить операцию записи.

-или-

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

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

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

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

Примеры

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

// Request authentication.
NetworkStream^ clientStream = client->GetStream();
NegotiateStream^ authStream = gcnew NegotiateStream( clientStream,false );

// Pass the NegotiateStream as the AsyncState object 
// so that it is available to the callback delegate.
IAsyncResult^ ar = authStream->BeginAuthenticateAsClient( gcnew AsyncCallback( EndAuthenticateCallback ), authStream );

Console::WriteLine( L"Client waiting for authentication..." );

// Wait until the result is available.
ar->AsyncWaitHandle->WaitOne();

// Display the properties of the authenticated stream.
AuthenticatedStreamReporter::DisplayProperties( authStream );

// Send a message to the server.
// Encode the test data into a byte array.
array<Byte>^message = Encoding::UTF8->GetBytes( L"Hello from the client." );
ar = authStream->BeginWrite( message, 0, message->Length, gcnew AsyncCallback( EndWriteCallback ), authStream );

// Request authentication.
NetworkStream clientStream = client.GetStream();
NegotiateStream authStream = new NegotiateStream(clientStream, false);
// Pass the NegotiateStream as the AsyncState object
// so that it is available to the callback delegate.
Task authenticateTask = authStream
    .AuthenticateAsClientAsync()
    .ContinueWith(task =>
    {
        Console.WriteLine("Client ending authentication...");
        Console.WriteLine("ImpersonationLevel: {0}", authStream.ImpersonationLevel);
    });

Console.WriteLine("Client waiting for authentication...");
// Wait until the result is available.
authenticateTask.Wait();
// Display the properties of the authenticated stream.
AuthenticatedStreamReporter.DisplayProperties(authStream);
// Send a message to the server.
// Encode the test data into a byte array.
byte[] message = Encoding.UTF8.GetBytes("Hello from the client.");
Task writeTask = authStream
    .WriteAsync(message, 0, message.Length)
    .ContinueWith(task =>
    {
        Console.WriteLine("Client ending write operation...");
    });

' Request authentication.
Dim clientStream = client.GetStream()
Dim authStream As New NegotiateStream(clientStream, False)

' Pass the NegotiateStream as the AsyncState object 
' so that it is available to the callback delegate.
Dim ar = authStream.BeginAuthenticateAsClient(
    New AsyncCallback(AddressOf EndAuthenticateCallback), authStream)

Console.WriteLine("Client waiting for authentication...")

' Wait until the result is available.
ar.AsyncWaitHandle.WaitOne()

' Display the properties of the authenticated stream.
AuthenticatedStreamReporter.DisplayProperties(authStream)

' Send a message to the server.
' Encode the test data into a byte array.
Dim message = Encoding.UTF8.GetBytes("Hello from the client.")
ar = authStream.BeginWrite(message, 0, message.Length, 
    New AsyncCallback(AddressOf EndWriteCallback), authStream)

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

// The following method is called when the write operation completes.
static void EndWriteCallback( IAsyncResult^ ar )
{
   Console::WriteLine( L"Client ending write operation..." );
   NegotiateStream^ authStream = dynamic_cast<NegotiateStream^>(ar->AsyncState);
   
   // End the asynchronous operation.
   authStream->EndWrite( ar );
}

' The following method is called when the write operation completes.
Public Shared Sub EndWriteCallback(ar As IAsyncResult)

    Console.WriteLine("Client ending write operation...")
    Dim authStream = CType(ar.AsyncState, NegotiateStream)

    ' End the asynchronous operation.
    authStream.EndWrite(ar)

End Sub

Комментарии

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

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

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

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

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

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