我有一个开放的TCP连接,并使用NetworkStream.BeginRead()进行读取。一旦连接在任一端关闭,调用回调并且流对象没用 - 就像文档说的那样,EndRead()抛出IOException或ObjectDisposedException,这取决于在哪种情况下终止连接。
是否保证在最后一次成功的EndRead(和重新BegingRead)和断开连接之间没有任何数据丢失,特别是如果我在我的结束时这样做?如果不是,如果我结束连接,我是否必须在断开连接时手动NetworkStream.Read()以确保没有任何内容未读?
答案 0 :(得分:2)
在这种情况下使用的模式是使用BeginRead来读取流(就像你正在做的那样)并在回调方法中处理'流中的更多数据'的情况。
回调方法调用EndRead并收集从流中读取的数据(通常通过将其附加到StringBuilder实例),然后再次调用BeginRead 。一旦EndRead返回0字节,就可以保证不再有数据从流中读取。
以下是您可能会发现有用的文档:Using async client sockets
我注意到那里没有任何地方特别声明0字节返回是保证,所以我理解你的困惑,但是这个例子非常明确,那是你退出阅读的信号。