c# - 在调用 Shutdown 然后在 Socket 上关闭时获取 ObjectDisposed 异常

标签 c# networking sockets

我有一个 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/

相关文章:

C#项目引用netcoreapp3.1中的F#类lib

c# - 多个 WebClient 不工作?

Linux 以太网桥

C - 通过 TCP 发送的缓冲区的适当大小

security - 开放、安全的 TCP channel 安全多长时间?

c# - ASP .NET 中 DataBind() 函数的反转是什么

c# - 正则表达式分割一个字符串

c# - Expression.Lambda 泛型中的非特定类型

linux - 亚马逊AWS机器无法连接

python - 通过带有代理身份验证的 imaplib 访问 gmail