在所有情况下都必须调用EndRead()吗?

Jas*_*ban 7 asynchronous asyncsocket

与使用(双向)NetworkStream的异步IO相关,MSDN表示"每次调用BeginRead都必须调用一次EndRead".

即使在EndRead()将抛出异常的情况下也是如此,例如在发布BeginRead()之后NetworkStream已关闭的情况下?

我不想要抛出异常的开销,但我也不想泄漏BeginRead()保留的OS宝贵资源.

我也知道流可以在流的状态测试和条件EndRead()之间关闭,但是如果我们知道流被关闭时可以省略EndRead(),那么将节省大多数情况下的异常处理.

我做错了吗?

谢谢!

Ant*_*hyy 7

GCHandle固定缓冲区和其他一些非托管资源将由完成端口回调释放.非托管OVERLAPPED结构将一直存在,直到IAsyncResult最终确定.如果应用程序中的网络负载不大,这可能是可以容忍的,但如果应用程序每秒处理多个连接,则可能会成为问题,因为最终化只在完整的GC集合之后和单独的线程上发生.

注意:这些是使用Reflector获得的实现细节.买者自负.

  • 真的不能说,因为我对你的应用程序一无所知,但我建议调用`EndRead`,除非你描述你的应用程序并发现异常`EndRead`抛出导致显着的性能损失. (3认同)