我试图在生产中使用一段时间的套接字库中发现奇怪的行为。
实际上,使用BeginReceive / EndReceive和BeginSend / EndSend调用处理Receive和send,因此所有内容都以异步方式处理。
此外,我有一个MonitorThread,它每秒轮询套接字的状态:
void ControlThreadCallback()
{
if (!IsConnected && m_ConnectionIP != null && !m_ConnectionIP.Equals(String.Empty) && m_ConnectionPort > 0)
{
//No connected, perform reconnection, recreate serversocket or dispose client socket if needed
}
}
IsConnected属性在同一个类中定义:
public bool IsConnected
{
get
{
try
{
return m_Socket != null && m_Socket.Connected &&
!(m_Socket.Poll(1, SelectMode.SelectRead) && m_Socket.Available == 0);
}
catch (Exception ex)
{
//Log error
//Object Disposed exception is being catched here sometimes
return false;
}
}
}
有时会捕获objectdisposedexception,因此将false返回给IsConnected属性,而ControlThread认为socket没有连接。但是,我在套接字中活动,所以根本没有断开连接。
只有在套接字上发送和接收大量数据时才会发生这种情况(即每秒钟发送超过20条消息)。
在哪些奇怪的情况下,Socket.Poll给出了objectDisposedException?并且,可能是socket之间的一些竞争条件.Poll&& socket.Available?
如果您需要更多代码,我可以粘贴更多代码段。