在什么条件下,NetworkStream不能同时读取所有数据?

时间:2011-10-11 19:04:07

标签: c# android stream android-asynctask networkstream

NetworkStream.BeginRead的回调中,我似乎注意到所有字节总是被读取。我看到许多教程检查BytesRead是否小于总字节数,如果是,请再次阅读,但似乎情况并非如此。

条件if (bytesRead < totalBytes)永远不会触发,即使一次发送大量数据(数千个字符),即使缓冲区大小设置为非常小的值(16左右)。

我没有使用'老式方式'测试它,因为我使用Task.Factory.FromAsync而不是调用NetworkStream.BeginRead并在我调用EndRead时提供回调。也许任务自动包含在读取所有数据之前不返回的功能?我不确定。

无论哪种方式,我仍然很好奇何时不能立即读取所有数据。是否甚至需要检查是否所有数据都被读取,如果是,请再次阅读?我似乎无法获得有条件的运行。

感谢。

1 个答案:

答案 0 :(得分:4)

尝试通过慢速链接发送兆字节数据。为什么流要先等待 all ,然后再向调用者提供任何内容?如果对方没有关闭连接怎么办 - 那时 没有“所有数据”的概念。

假设您打开与另一台服务器的连接并使用大缓冲区调用BeginRead(或Read),但它只发送100个字节,然后等待您的回复 - 您期望什么{{ 1}}要做什么?永远不要给你数据,因为你给了它太大的缓冲区?这将非常适得其反。

你应该绝对不要假设任何流(有NetworkStream的可论证的例外)将填充你给它的缓冲区。 MemoryStream总是可以用于本地文件,但我期望它不适用于共享文件。

编辑:显示缓冲区未填充的示例代码 - 发出HTTP 1.1请求(非常糟糕:)

FileStream