2014-11-03 27 views
0

假设我有一个长时间运行的线程(守护进程或服务),并且我不想不必要地累积内存,并且我想使用EventLog。C#中事件日志枚举器的内存使用情况

我有类似的代码:

EventLog myEventLog = new EventLog; 
myEventLog.Log = "Application"; 
IEnumerator eventEnumerator = myEventLog.Entries.GetEnumerator(); 
int eventLogIndex = 0; 

然后我设置的时间间隔熄灭的方法从事件日志阅读:

while(myEventLog.Entries.Count > eventLogIndex) 
{ 
    eventEnumerator.MoveNext(); 
    eventLogIndex ++; 
    // do something with eventEnumerator.Current) 
} 

所以枚举不断向上移动的事件日志如果更多的东西被添加到它。我这样做是因为我读了here,如果事件同时进入,使用EventWritten处理程序可能会错过事件。

我的问题是:这会导致内存使用量积累?将事件日志的使用值从内存中删除,还是将整个事件列表保留在内存中直到线程关闭?而且,如果是这样,是否有解决此问题的方法,这对于传入的EventLogEntry是线程安全的?

+0

@ErikFunkenbusch这取决于枚举器的实现。它必须竭尽全力去检查更新,如果有更新,就会自动失效。许多迭代器不会这样做。 – Servy 2014-11-03 16:39:53

+0

即使读取的条目被删除(超出范围并且不再被引用),它们仍将消耗内存,直到垃圾收集器被执行,这可能不会很快发生。只是为了调试,你可以运行垃圾收集器来查明内存是否缩小。 – Gui 2014-11-03 16:40:30

+0

@ErikFunkenbusch这绝对不是EventLog的情况。这是枚举器的实现懒惰地加载MoveNext中的实际Windows日志中的每个项目。 – galenus 2014-11-03 16:41:26

回答

1

通过查看the code您可以验证,存在内存使用率的累积。只要你持有对EventLog实例的引用,用法就会增长。

但是,累积的不是EventLogEntry类的实例,而是原始日志数据。所以内存消耗将是相对低。

通过模拟生产系统的典型行为并跟踪内存使用情况,您应该在实际生活场景中检查它。

+0

我想我在[MSDN的EventLog.Close()方法规范]中找到了一些有用的信息(http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.clear(v = vs。 110).aspx): 根据备注,它说事件日志的大小是有限的,当它满了时,它会停止记录或覆盖现有条目。 Close()方法用于重置该方法。 – SpikeMF 2014-11-03 17:46:16