gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:12:56 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com