SslStream.EndRead(IAsyncResult) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Заканчивает асинхронную операцию чтения, запущенную до этого вызовом метода BeginRead(Byte[], Int32, Int32, AsyncCallback, Object).
public:
override int EndRead(IAsyncResult ^ asyncResult);
public override int EndRead (IAsyncResult asyncResult);
override this.EndRead : IAsyncResult -> int
Public Overrides Function EndRead (asyncResult As IAsyncResult) As Integer
Параметры
- asyncResult
- IAsyncResult
Экземпляр IAsyncResult, возвращенный вызовом метода BeginRead(Byte[], Int32, Int32, AsyncCallback, Object).
Возвращаемое значение
Значение Int32, указывающее количество байтов, считанное из базового потока.
Исключения
asyncResult
имеет значение null
.
Параметр asyncResult
не был создан вызовом метода BeginRead(Byte[], Int32, Int32, AsyncCallback, Object).
Нет ожидающей завершения операции чтения.
-или-
Проверка подлинности не выполнялась.
Сбой операции чтения.
Примеры
В следующем примере кода демонстрируется завершение асинхронной операции чтения.
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 = dynamic_cast<SslStream^>(ar->AsyncState);
int byteCount = -1;
try
{
Console::WriteLine( L"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();
array<Char>^chars = gcnew array<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( L"<EOF>" ) == -1 && byteCount != 0 )
{
// We are not finished reading.
// Asynchronously read more message data from the server.
stream->BeginRead( buffer, 0, buffer->Length, gcnew AsyncCallback( ReadCallback ), stream );
}
else
{
Console::WriteLine( L"Message from the server: {0}", readData );
}
}
catch ( Exception^ readException )
{
e = readException;
complete = true;
return;
}
complete = true;
}
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
Комментарии
Если операция не завершена, этот метод блокируется до тех пор, пока она не будет выполнена.
Чтобы выполнить эту операцию синхронно, используйте Read метод.
Этот метод нельзя вызвать до тех пор, пока не будет успешно выполнена проверка подлинности. Чтобы выполнить проверку подлинности, вызовите один из AuthenticateAsClientметодов или BeginAuthenticateAsClient, AuthenticateAsServerBeginAuthenticateAsServer