In einer Dienstanwendung durchläuft ich das Windows-Anwendungsereignisprotokoll, um Ereignisse zu analysieren, um abhängig von der Eintragsnachricht zu reagieren. Wenn das Ereignisprotokoll voll ist (Windows stellt normalerweise sicher, dass durch Löschen alter Einträge genügend Speicherplatz verfügbar ist - dies ist in den Einstellungen eventvwr.exe
konfigurierbar), läuft der Dienst beim Durchlaufen der EventLog.Entries
-Auflistung immer in IndexOutOfBoundsException
. Egal, wie ich iteriere (For-Loop, Verwendung des Collections-Enumerators, Kopieren der Collection in ein Array, ...), ich kann diesen "Bug" scheinbar nicht loswerden.Iterieren durch Ereignisprotokolleintragsauflistung, IndexOutOutOfBoundsException
Zurzeit stelle ich sicher, dass das Protokoll nicht voll ist, um den Dienst laufen zu lassen, indem ich regelmäßig die letzten Einträge lösche, indem ich die Ereignisprotokolldatei analysiere und die letzten Knoten lösche (Mach mich nicht fertig, ich könnte nicht finde keine bessere Alternative ...).
Wie kann ich durch die Sammlung iterieren, ohne auf bereits gelöschte Einträge zuzugreifen?
Gibt es wahrscheinlich eine elegantere Methode? Ich versuche nur auf die Logs zuzugreifen, die während der letzten x
Sekunden geschrieben wurden (selbst LINQ konnte die Logs nicht auswählen, wenn das Log voll ist - die gleiche Ausnahme), könnte das helfen?
Vielen Dank für jede Beratung und Hinweise
Frank
Edit: Ich vergaß zu erwähnen, dass meine Annahme ist die Schleifen-Einträge zugreifen, die während der Iteration des von Windows gelöscht werden. Im Grunde habe ich deshalb versucht, die Sammlung zu klonen. Gibt es vielleicht eine Möglichkeit, die Sammlung für eine kurze Zeit für meine Anwendung zu sperren?
Sicher, wenn der Eintrag weg ist, gibt es nichts, was ich tun könnte. Wie auch immer, die Schleife bricht in diesem Fall ab und es könnten einige Einträge übersprungen werden, die das Behandlungsereignis in meinem Dienst auslösen sollten. In der nächsten Überprüfungsschleife behandelt mein Programm diese Einträge als veraltet (weil es sie zuvor hätte behandeln sollen) und sie werden niemals überhaupt etwas auslösen. – fjdumont