我目前有一个项目,该项目每隔x秒钟(使用Timer和10000毫秒间隔)就会在Windows上发生事件,并在特定条件下对其进行过滤。 每次Timer计时时,都会检查时刻事件之前10秒(由于时间间隔)所对应的日期和小时,并执行下一个方法:
// Method that returns wanted events from an EventLogEntryCollection
private List<EventLogEntry> lastEvents(EventLogEntryCollection eventsList, DateTime minimumMoment)
{
// Wanted events list
// 4624: Login
// 4634: Logout
long[] events = new long[] { 4624, 4634 };
// Table to return with valid events
List<EventLogEntry> filteredEventsList = new List<EventLogEntry>();
// Checking if there are events to filter
if (eventsList.Count > 0)
{
// There are events to filter
// Going across all events to filter
for (int i = 0; i < eventsList.Count; i++)
{
// Getting the current event
EventLogEntry event = eventsList[i]; // Line with exception
// Checking if the current event happened in the last 10 seconds (due to the Interval)
if (event.TimeGenerated >= minimumMoment)
{
// The event is valid time wise
// Checking if the event's ID is contained in the required ID's list
if (events.Contains(event.InstanceId))
{
// The event has a valid ID
// Adding the event to the list
filteredEventsList.Add(event);
}
}
}
}
// Returning obtained list
return filteredEventsList;
}
该事件获取所有事件的列表(通过使用EventLog.Entries获取)以及必须将事件添加到过滤后的事件列表中的日期和时间(因此必须在10秒钟前生成一个事件'公认')。
但是,在eventsList迭代期间,将在第一个测试28000和第二个测试43以及两个测试的31000左右的Count属性生成i的IndexOutOfRangeException
。
¿有人能告诉我为什么会这样吗?
以下是异常数据的屏幕截图(抱歉,它是西班牙语): IndexOutOfRange exception data
答案 0 :(得分:0)
根据the docs:
EventLogEntry对象由事件日志系统根据 他们到达事件日志的时间顺序。采用 Item [Int32]属性以选择特定事件日志条目, 集合中的索引是已知的。
遍历EventLogEntryCollection实例的步骤 每个EventLogEntry对象按顺序。集合是动态的 进入循环时,条目数可能不会一成不变。 因此,您应该为每个...下一个循环使用,而不要使用for循环来逐步浏览相关的条目 与EventLogEntryCollection实例一起检查整个 条目。
因为新条目将添加到现有列表中,所以 通过集合可以访问 是在最初创建EventLogEntryCollection之后创建的。
另外,Count的文档状态为:
EventLogEntryCollection代表所有 日志中的条目。因此,Count属性可以在 您创建的EventLogEntryCollection实例的生存期。它 通常最好直接使用Count属性而不是 将其值分配给变量。
因此,简而言之,Count
正在变化(可能减小),从而导致您查找不再存在的索引。使用foreach
而非for
将为您解决此问题。