我试图在 生产环境 中使用一段时间的套接字库中发现奇怪的行为 .
实际上,接收和发送是使用BeginReceive / EndReceive和BeginSend / EndSend调用处理的,因此所有内容都以异步方式处理 .
此外,我有一个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?
如果您需要更多代码,我可以粘贴更多代码段 .