2016-05-26 20 views
1

ich ein Event Log-Datei .evt Datei von C# zu lesen versuchen, und unter Verwendung eines Filters, um nur die Framework 2.0 Einträge zu erhalten:lesen Event Log-Datei (EVT) C# throw Daten ist nicht gültig

string query = "*[System/Provider/@Name=\"ASP.NET 2.0.50727.0\"]"; 

var elQuery = new EventLogQuery("C:\evento.evt", PathType.FilePath, query); 
var elReader = new System.Diagnostics.Eventing.Reader.EventLogReader(elQuery); 

List<EventRecord> eventList = new List<EventRecord>(); 

for (EventRecord eventInstance = elReader.ReadEvent(); null != eventInstance; eventInstance = elReader.ReadEvent()) 
{ 
    string source = eventInstance.ProviderName; 

    eventList.Add(eventInstance); 
    if (eventInstance.Properties.Count > 3) 
    { 
     string dateTime = eventInstance.Properties[2].Value.ToString(); 
     string message = eventInstance.Properties[1].Value.ToString(); 
    } 
} 

wenn ich einen Haltepunkt setzen, sehe ich richtige Ergebnis für ein paar Event Log-Einträge, aber wenn ich F5 drücken, elReader.ReadEvent() werfen der Fehler Daten nicht gültig ist

Jede Hilfe ? Vielen Dank!

Antwort

1

In einer for Schleife wird die Bedingung erst nach nach der Iteration überprüft. Also hier, elReader.ReadEvent() wird null zurückgeben, und setzen Sie das in eventInstance. Dann wird der Schleifenkörper ausgeführt, dann wird es überprüfen, ob eventInstancenull ist und zu stoppen.

Der normale Weg, diese Art von Lese bis null Schleife zu tun ist, anstatt eine while Schleife zu verwenden, in dem Sie die Variable und überprüfen Sie den Zustand zur gleichen Zeit eingestellt:

while ((EventRecord eventInstance = elReader.ReadEvent()) != null) 
{ 
    // as before 
} 

Dieses Set wird eventInstance aus ReadEvent() wie zuvor, aber überprüfen Sie, ob das nullvor den Körper der Schleife ausgeführt.

Der klassische andere Ort, an dem dieses Muster in .NET verwendet wird, ist das Lesen von Zeilen in einer Textdatei, z. siehe hierzu example on MSDN