在for循环中遍历EventLogEntryCollection时IndexOutOfRangeException

时间:2019-07-17 12:18:51

标签: c# event-log indexoutofrangeexception

我目前有一个项目,该项目每隔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

1 个答案:

答案 0 :(得分:0)

根据the docs

  

EventLogEntry对象由事件日志系统根据   他们到达事件日志的时间顺序。采用   Item [Int32]属性以选择特定事件日志条目,   集合中的索引是已知的。

     

遍历EventLogEntryCollection实例的步骤   每个EventLogEntry对象按顺序。集合是动态的   进入循环时,条目数可能不会一成不变。   因此,您应该为每个...下一个循环使用,而不要使用for循环来逐步浏览相关的条目   与EventLogEntryCollection实例一起检查整个   条目。

     

因为新条目将添加到现有列表中,所以   通过集合可以访问   是在最初创建EventLogEntryCollection之后创建的。

另外,Count的文档状态为:

  

EventLogEntryCollection代表所有   日志中的条目。因此,Count属性可以在   您创建的EventLogEntryCollection实例的生存期。它   通常最好直接使用Count属性而不是   将其值分配给变量。

因此,简而言之,Count正在变化(可能减小),从而导致您查找不再存在的索引。使用foreach而非for将为您解决此问题。