Socket.Poll()中的ObjectDisposedException c#

时间:2016-07-06 08:49:57

标签: c# sockets .net-4.5 objectdisposedexception

我试图在生产中使用一段时间的套接字库中发现奇怪的行为。

实际上,使用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?

如果您需要更多代码,我可以粘贴更多代码段。

0 个答案:

没有答案