NegotiateStream.BeginRead(Byte[], Int32, Int32, AsyncCallback, Object) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
开始一个异步读操作,此操作读取流中的数据并将其存储在指定的数组中。
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
buffer
中从零开始的位置,从此处开始存储从此流中读取的数据。
- count
- Int32
要从流中读取的最大字节数。
- asyncCallback
- AsyncCallback
AsyncCallback 委托,该委托引用读操作完成时要调用的方法。
- asyncState
- Object
用户定义的对象,其中包含读操作的相关信息。 操作完成时,此对象传递给 asyncCallback
委托。
返回
一个指示异步操作状态的 IAsyncResult 对象。
例外
buffer
为 null
。
已存在一个正在执行的读取操作。
此对象已关闭。
未进行身份验证。
示例
下面的代码示例演示如何启动异步读取操作。 此代码示例是为 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 。
在成功进行身份验证之前,无法调用此方法。 若要进行身份验证,请调用 、AuthenticateAsClientAsync、、BeginAuthenticateAsClientAuthenticateAsServer、 AuthenticateAsServerAsync或 BeginAuthenticateAsServer 方法之AuthenticateAsClient一。