我有公共列表包含自定义对象,我已声明为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对象,有人可以建议吗?
答案 0 :(得分:1)
当您的机器进入睡眠状态时,所有连接都将关闭。
如果您长时间等待而没有做任何事情,由于超时,您的连接可能也会关闭。
因此,您的列表不为空,您的问题与已处置的对象无关。您的列表仍然已满,但它包含ConnectedClient
个对象,这些对象代表现已关闭的关联,因此c.ServerClient
或c.ServerClient.LocalEndPoint
等属性无效,因此无法找到Where()
一场比赛。
.FirstOrDefault();
调用将返回找到的第一个项目,如果找不到任何项目,则返回null
。
由于没有找到任何项目,因此您获得null
。