在WCF服务中使用大量数据列表后清理内存

本文关键字:列表 数据 内存 服务 WCF | 更新日期: 2023-09-27 17:58:30

我有一个WCF客户端,并连接到Windows服务中托管的WCF服务器。在服务中,我从安全事件日志中读取了最后一天的条目。然后,我解析条目并创建自己的List<Data>,并将其返回到WCF客户端以在DataGrid中显示。问题是,在Security事件日志中,我有30000个条目,在解析每个条目后,我会创建30000个类型为Data的新对象。此类型是一个具有15个字符串属性的类,其中包含事件日志中消息的详细信息。在整个过程之后,Windows服务的内存使用量增加了60-70MB。一旦我将这一大组数据发送到客户端,我如何将Windows服务使用的内存从70-80MB降低到默认的10MB?

这是我的代码:

public List<Data> GetConnections()
{        
   var eventLog = new EventLog("Security");
   var fromDate = DateTime.Now.AddDays(-1);
   var entries = (from EventLogEntry e in eventLog.Entries
                   where (e.InstanceId == m_EventNumber) && e.TimeGenerated >= fromDate orderby e.TimeGenerated
                   select e).ToList()
                            .OrderByDescending(x => x.TimeGenerated);
   var items = new List<Data>();
   foreach(var item in entries)
   {
      var nData = ParseMessage(item.Message);
      if (nData != null)
          items.Add(ruleData);
   }
   return items;
}

在WCF服务中使用大量数据列表后清理内存

更高效的代码:只有一个循环而不是两个,GC收集的对象更少。

var q = from EventLogEntry e in eventLog.Entries
        where (e.InstanceId == m_EventNumber) && e.TimeGenerated >= fromDate orderby e.TimeGenerated
        order by e.TimeGenerated desc
        let r = ParseMessage(e.Message)
        where r != null
        select r;
return new List<Data>(q);

每次调用服务时,您的内存消耗是否都在增加?如果您每分钟拨打一次该服务,一小时后您是否有60*70MB的内存使用?如果没有,那么您可能没有内存泄漏。你不需要采取任何行动。