与使用(双向)NetworkStream的异步IO相关,MSDN表示“每次调用BeginRead时都必须调用一次EndRead。”
即使对于EndRead()将抛出异常的情况(例如在发布BeginRead()之后NetworkStream已关闭的情况下,这是否也是如此?
我不想要抛出异常的开销,但我也不想泄漏BeginRead()保留的OS宝贵资源。
我也知道流可以在流的状态测试和条件EndRead()之间关闭,但是当我们知道流被关闭时,如果可以省略EndRead(),那么将在大多数情况下节省异常处理。
我做错了吗?
谢谢!
答案 0 :(得分:6)
GCHandle
固定缓冲区和其他一些非托管资源由完成端口回调释放。非托管OVERLAPPED
结构将一直存在,直到IAsyncResult
完成。如果应用程序中的网络负载不大,这可能是可以容忍的,但如果您的应用程序每秒处理多个连接,则可能会出现问题,因为最终化只在完整的GC集合之后和单独的线程上发生。
注意:这些是使用Reflector获得的实现细节。注意事项。