c# - 在 WCF 服务中使用大量数据后清理内存

标签 c# windows wcf memory-management event-log

我有一个 WCF 客户端并连接到 Windows 服务中托管的 WCF 服务器。在服务中,我从安全事件日志中读取了最后一天的条目。然后我解析条目并创建我自己的 List<Data>我返回到我的 WCF 客户端以在 DataGrid 中显示它。问题是,在安全事件日志中,我有 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;
}

最佳答案

更高效的代码:只有一个循环而不是两个循环,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);

关于c# - 在 WCF 服务中使用大量数据后清理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14783120/

相关文章:

c# - 如何将 Linq 结果与 RDLC 报告一起使用?

c# - 哪一个更好? "var"还是 "DataType"?

windows - 用源IP Ping IP?

c# - 如何为多个 WCF 客户端创建 Polly 的策略

javascript - 我如何找到 radio 的输入元素并检查它?总是 "Unable to find element "

c# - 混合通用方法和扩展方法

linux - 在 Docker 容器中挂载 SMB/CIFS 共享

android - 如何在没有 Android Studio 的情况下仅使用 SDK 工具为 React-Native 设置 Android?

.net - 如何以编程方式检查 WCF Http/Non-Http 激活组件?

wcf - Windows 服务中托管的 MSMQ 支持的 WCF 服务在启动时失败