1

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;
}
4

2 に答える 2

2

もう少し効率的なコード:2つではなく1つのループのみで、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);
于 2013-02-08T23:43:11.963 に答える
1

サービスを呼び出すたびにメモリ消費量が増え続けますか?1分に1回サービスを呼び出す場合、1時間後に60 * 70MBのメモリを使用しますか?そうでない場合は、メモリリークが発生していない可能性があります。何もする必要はありません。

于 2013-02-09T00:06:20.587 に答える