假设我有一个长时间运行的线程(守护进程或服务),并且我不想不必要地累积内存,并且我想使用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是线程安全的?
@ErikFunkenbusch这取决于枚举器的实现。它必须竭尽全力去检查更新,如果有更新,就会自动失效。许多迭代器不会这样做。 – Servy 2014-11-03 16:39:53
即使读取的条目被删除(超出范围并且不再被引用),它们仍将消耗内存,直到垃圾收集器被执行,这可能不会很快发生。只是为了调试,你可以运行垃圾收集器来查明内存是否缩小。 – Gui 2014-11-03 16:40:30
@ErikFunkenbusch这绝对不是EventLog的情况。这是枚举器的实现懒惰地加载MoveNext中的实际Windows日志中的每个项目。 – galenus 2014-11-03 16:41:26