从Event Log Class的文档中,EventLogEntryCollection是事件日志条目的动态列表。它建议直接使用Count属性,而不是将其值存储在变量中。实现此行为:
private void ReadEventLog()
{
EventLog eventLog = new EventLog("Application", "TheGreatestMachineInTheWorld");
EventLogEntryCollection eventLogEntries = eventLog.Entries;
for (int i = 0; i < eventLogEntries.Count; i++){
EventLogEntry entry = eventLog.Entries[i];
//Do Some processing on the entry
}
大型事件日志(> 20000个条目)速度很慢。 for循环而不是foreach的原因是因为我需要迭代器位置来指示这个东西与完成的接近程度。
存储count变量并迭代:
int eventLogEntryCount = eventLogEntries.Count;
for (int i = 0; i < eventLogEntryCount; i++){
EventLogEntry entry = eventLog.Entries[i];
//Do Some processing on the entry
}
提供显着的性能提升。但是,如果在处理发生时写入事件日志,则可能会导致索引超出范围异常。有没有办法静态存储这个列表,所以计数不会改变?
答案 0 :(得分:5)
有没有办法静态存储这个列表,所以计数不会改变?
听起来你想要这样的东西:
List<EventLogEntry> entries = eventLogEntries.Cast<EventLogEntry>().ToList();
这会将所有日志条目(当时)提取到List<T>
,然后可以快速访问索引器或另一个foreach
。
当然,您可能会发现获取所有日志条目的速度很慢 - 您应该尝试一下。