1

在服务应用程序中我正在遍历Windows应用程序事件日志来解析事件,以便对输入消息作出反应。 在事件日志已满的情况下(Windows通常会通过删除旧条目来确保有足够的空间 - 这可以在eventvwr.exe设置中进行配置),但该服务始终在遍历EventLog.Entries集合时运行到IndexOutOfBoundsException。无论我如何迭代(for-loop,使用集合枚举器,将集合复制到数组中,...),我似乎都无法摆脱这个'bug'。通过事件日志条目集合进行迭代,IndexOutOutOfBoundsException

目前,我通过解析事件日志文件并删除最后几个节点来定期删除最后几个项目,以确保日志未满以保持服务正常运行(不要殴打我,我不能找不到更好的选择...)。

如何在不尝试访问已经删除的条目的情况下遍历集合?

是否有更优雅的方法?我只是试图访问在最后x秒内写入的日志(即使LINQ在日志已满时也没有选择这些日志 - 同样的例外),这可以帮助吗?

感谢您的任何建议和提示

弗兰克

编辑:我忘了提,我的假设是循环正在访问其正在由Windows迭代过程中删除的条目。基本上这就是为什么我试图克隆收藏。是否有可能为我的应用程序锁定少量时间的集合?

回答

1

从实际的角度来看,为什么会有问题呢?

如果你想遍历所有的条目,有时当你试图读取一个并不存在的条目时,你会得到一个IndexOutOfBoundsException,那么只需要捕获这个异常并忽略它。

如果你知道这个异常是什么意思,并且你知道你想要做什么,只要处​​理异常并继续工作。这就是例外,毕竟......

+0

当然,当条目消失时,我无能为力。无论如何,在这种情况下循环会取消,并且可能会跳过一些应该触发我的服务中的处理事件的条目。在下一个检查循环中,我的程序将这些条目处理为过时(因为它应该先处理它们),并且它们根本不会发射任何东西。 – fjdumont 2011-01-12 14:16:24

0

万一有人发现这个线程:

避免这种行为似乎并不可能。即使复制集合失败并锁定文件也是不可能的(由于系统限制)。相反,我实现了一种定期检查算法,该算法备份事件日志并以定义的使用百分比(例如95%)清除它,使得不应发生溢出或删除。

4

我也打过这个,2008R2域控制器更是如此。问题是日志正在包装,所以当你开始迭代事件和当你到达这个点时,索引似乎会改变。

除了重试,似乎不是一种治疗方法。