我对使用异步模式进行流读写比较陌生,想知道这个问题的答案是否如此明显以至于没有明确地写在任何地方:
调用 a 时NetworkStream.BeginRead
,我传递了一个回调参数,根据 MSDN,该参数在“BeginRead 完成时”执行。它还说“你的回调方法应该调用 EndRead 方法”。
然后根据文档NetworkStream.EndRead
,“方法完成在 BeginRead 方法中启动的异步读取操作”。它还提到这种方法“在数据可用之前一直阻塞”。
我知道 EndRead 方法对于确定接收到的字节数也很有用。
我的问题是:
如果在 BeginRead 回调中调用 EndRead 方法,它真的会阻塞吗?调用回调时读取操作不是已经完成了吗?
示例代码
byte[] streamBuffer = new byte[1024];
public void SomeFunction()
{
TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse("127.0.0.1"), 32000);
NetworkStream stream = client.GetStream();
stream.BeginRead(streamBuffer,0,streamBuffer.Length,ReadCallback,stream);
}
public void ReadCallback(IAsyncResult ar)
{
NetworkStream stream = ar.AsyncState as NetworkStream;
// Will this call ever actually "block" or will it
// return immediately? Isn't the read operation
// already complete?
int bytesRead = stream.EndRead(ar);
// Other stuff here
}