我有一个 SocketState 对象,我用它来将缓冲区和套接字包装在一起,并将其传递给 Begin/End 异步套接字方法。在析构函数中,我有这个:
~SocketState()
{
if (!_socket.Connected) return;
_socket.Shutdown(SocketShutdown.Both);
_socket.Close();
}
当它到达 Close() 时,我得到一个 ObjectDisposed 异常。如果我注释掉 Shutdown() 调用,当它到达 Close() 方法时我不会收到错误。我做错了什么?
编辑:
我知道 IDisposable 解决方案似乎是我的代码应该如何布局,但这实际上并不能解决我的问题。它不像析构函数被调用两次,那么为什么调用 dispose() 而不是使用析构函数对我有帮助?连续调用这 2 个函数时,我仍然遇到相同的异常。
我查看了类似服务器的源代码,他们所做的就是将这 2 个语句包装在一个 try block 中并吞下异常。如果必须的话,我会这样做,因为它看起来无害(我们无论如何都会关闭它),但如果可能的话,我想避免它。
最佳答案
使用反射器;看起来 Close()
本质上只是调用 Socket 上的 Dispose()
(它在任一侧都做了一些日志记录)。查看 Shutdown()
,它在套接字句柄上调用 ws2_32.dll!shutdown()
,也由 Dispose( )
。可能发生的情况是它试图在同一个套接字句柄上调用 ws2_32.dll!shutdown()
两次。
简而言之,答案就是调用 Close()
。
关于c# - 在调用 Shutdown 然后在 Socket 上关闭时获取 ObjectDisposed 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/622472/