7

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

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

我不希望抛出异常的开销,但我也不希望泄露 BeginRead() 保留的操作系统宝贵资源。

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

我做错了吗?

谢谢!

4

1 回答 1

7

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

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

于 2011-06-23T08:22:02.653 回答