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
Параметры
- 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 .