我正在审核一些使用Socket
类的代码,特别是属性Available
,以检查是否已收到数据并准备好阅读。
在程序运行期间,有时在访问属性ObjectDisposedException
时会抛出Available
。
我现在的问题是,在访问属性Connected
之前向Available
属性添加检查是否足以避免异常。类Socket不提供IsDisposed
等属性。
像
这样的东西if (socket.Connected && socket.Available)
其他问题是Socket何时转换到此Disposed状态?只有当我在Socket实例上显式调用Close
或Dispose
时才有可能在读取/写入套接字时发生SocketException
时达到状态。首先看程序代码似乎能很好地处理套接字的生命周期。
答案 0 :(得分:0)
如果您在Socket.Connected上查找http://referencesource.microsoft.com/ 您将看到Connected的属性在第569行执行对Poll(..)的调用时将抛出ObjectDisposedException。 但是还有一个内部状态“m_NonBlockingConnectInProgress”必须是真的。
当您调用Socket.Connect(...)并且Socket.Blocking为false时,“m_NonBlockingConnectInProgress”为true。
如果属性CleanedUp为true,那么Socket.Available将抛出一个ObjectDisposedException,当Socket被释放时,它看起来像属性CleanedUp为真