自动处理的列表对象C#

时间:2017-07-22 12:24:37

标签: c#

我有公共列表包含自定义对象,我已声明为Windows窗体

private List<ConnectedClient> connectedClients = new List<ConnectedClient>();

我在客户端绑定

的某些事件中添加了对象
private void server_evClientBind(object sender, ServerClient client, Bind data)
{
lock (connectedClients)
   {
       connectedClients.Add(clientDTO);
   }
 }

当客户端提交消息时,我通过客户端对象接收数据过滤事件server_evClientSubmitSm上的connectedClients List然后决定接受它或拒绝来自客户端

private void server_evClientSubmitSm(object sender, ServerClient client, SubmitSm data)
    {
        try
        {                
            ConnectedClient clientDto = null;
            lock (connectedClients)
            {
                clientDto = connectedClients.Where(c => !string.IsNullOrWhiteSpace(c.ServerClient.SystemID) && c.ServerClient.SystemID.Trim() == client.SystemID.Trim()
                && c.ServerClient.LocalEndPoint.Address != null && c.ServerClient.LocalEndPoint.Address == client.LocalEndPoint.Address
                && c.ServerClient.LocalEndPoint.Port > new int() && c.ServerClient.LocalEndPoint.Port == client.LocalEndPoint.Port).FirstOrDefault();
            }

            if (clientDto != null)
            {
                //receive Message
            }
            else
            {
                //object not exist 
            }
        }
    }

但是在应用程序睡眠或暂停(客户端不提交消息)一段时间后我不知道,他回来提交消息但下面的部分返回null

ConnectedClient clientDto = null;
        lock (connectedClients)
        {
            clientDto = connectedClients.Where(c => !string.IsNullOrWhiteSpace(c.ServerClient.SystemID) && c.ServerClient.SystemID.Trim() == client.SystemID.Trim()
            && c.ServerClient.LocalEndPoint.Address != null && c.ServerClient.LocalEndPoint.Address == client.LocalEndPoint.Address
            && c.ServerClient.LocalEndPoint.Port > new int() && c.ServerClient.LocalEndPoint.Port == client.LocalEndPoint.Port).FirstOrDefault();
        }

我猜问题是在几分钟后内存释放List对象,有人可以建议吗?

1 个答案:

答案 0 :(得分:1)

当您的机器进入睡眠状态时,所有连接都将关闭。

如果您长时间等待而没有做任何事情,由于超时,您的连接可能也会关闭。

因此,您的列表不为空,您的问题与已处置的对象无关。您的列表仍然已满,但它包含ConnectedClient个对象,这些对象代表现已关闭的关联,因此c.ServerClientc.ServerClient.LocalEndPoint等属性无效,因此无法找到Where()一场比赛。

.FirstOrDefault();调用将返回找到的第一个项目,如果找不到任何项目,则返回null

由于没有找到任何项目,因此您获得null