我尝试理解MSDN关于NetworkStream.EndRead()的示例,但有一些部分我不太明白。
这是示例(来自MSDN):
// Example of EndRead, DataAvailable and BeginRead.
public static void myReadCallBack(IAsyncResult ar ){
NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
byte[] myReadBuffer = new byte[1024];
String myCompleteMessage = "";
int numberOfBytesRead;
numberOfBytesRead = myNetworkStream.EndRead(ar);
myCompleteMessage =
String.Concat(myCompleteMessage, Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
// message received may be larger than buffer size so loop through until you have it all.
while(myNetworkStream.DataAvailable){
myNetworkStream.BeginRead(myReadBuffer, 0, myReadBuffer.Length,
new AsyncCallback(NetworkStream_ASync_Send_Receive.myReadCallBack),
myNetworkStream);
}
// Print out the received message to the console.
Console.WriteLine("You received the following message : " +
myCompleteMessage);
}
它使用BeginRead()和EndRead()来异步从网络流中读取。整个过程通过调用来调用。
myNetworkStream.BeginRead(someBuffer, 0, someBuffer.Length, new AsyncCallback(NetworkStream_ASync_Send_Receive.myReadCallBack), myNetworkStream);
在其他地方(不在示例中显示)。
我认为它应该做的是在单个WriteLine
(示例末尾的那个)中打印从NetworkStream接收到的整个消息。请注意,字符串称为myCompleteMessage
。
现在,当我查看实现时,我的理解出现了一些问题。
首先:示例分配了一个新的方法本地缓冲区myReadBuffer
。然后调用EndStream()将接收到的消息写入提供BeginRead()的缓冲区。这不是刚刚分配的myReadBuffer
。网络流怎么知道呢?因此,在下一行,将从空缓冲区中附加numberOfBytesRead
字节到myCompleteMessage
中。它的当前值为""
。在最后一行,使用Console.WriteLine
打印这条由许多'\0'
组成的消息。
这对我来说毫无意义。
第二件我不理解的事情是while
循环。
BeginRead
是异步调用。因此,没有立即读取数据。因此,据我所知,while循环应该运行相当长的时间,直到实际执行某些异步调用并从流中读取数据,以便不再有可用数据。文档没有说BeginRead
立即将某些可用数据标记为已读取,因此我不希望它这样做。
这个示例并没有提高我对这些方法的理解。这个示例是错误的还是我的理解是错误的(我期望后者)?这个示例如何工作?