我试图理解 NetworkStream.EndRead() 的 MSDN 示例。有些部分我不明白。
所以这里是示例(从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
. 其中有当前值""
。在最后一行中,这条由很多'\0'
s 组成的消息用 打印Console.WriteLine
。
这对我来说没有任何意义。
我不明白的第二件事是while
-loop。
BeginRead
是一个异步调用。因此不会立即读取任何数据。所以据我了解,while 循环应该运行很长一段时间,直到实际执行一些异步调用并从流中读取,这样就没有可用的数据了。文档并没有说BeginRead
立即将某些可用数据标记为已读取,因此我不希望它这样做。
这个例子并没有提高我对这些方法的理解。这个例子是错误的还是我的理解错误(我希望是后者)?这个例子是如何工作的?