Ereignisprotokolle und Multithreadkomponenten
Ereignisprotokolle dienen der Nachverfolgung von wichtigen Ereignissen, während eine Anwendung ausgeführt wird. Mithilfe von Ereignisprotokollen können Sie Informationen aufzeichnen, die zur Problembehandlung oder für die Leistungsanalyse hilfreich sein können. Beim Protokollieren von Ereignissen in Multithreadkomponenten müssen einige zusätzliche Aspekte beachtet werden. Zunächst muss es einen Mechanismus geben, der die Identität des Threads aufzeichnet, von dem die Meldung protokolliert wird. Zweitens muss bei der Interaktion mit dem Ereignisprotokoll der Threadsicherheit Rechnung getragen werden. Der Thread, der versucht, eine Meldung zu schreiben, muss eine exklusive Sperre auf das Protokoll erhalten, damit Racebedingungen ausgeschlossen werden können. Eine Übersicht über Ereignisprotokolle finden Sie unter Verwalten von Ereignisprotokollen. Weitere Informationen zur Threadsicherheit erhalten Sie unter Threadsichere Komponenten.
Um die einzelnen Threads zu identifizieren, müssen Sie die Thread.Name-Eigenschaft festlegen. Diese Eigenschaft nimmt einen String-Wert an bzw. gibt ihn zurück. Mit ihr kann für jeden Thread ein eindeutiger Bezeichner festgelegt werden. Dieser Wert kann dann an die EventLog.CreateEventSource-Methode übergeben werden, um den Thread als Ereignisquelle für jeden Thread festzulegen. Bei der Ereignisprotokollierung kann der Thread den eigenen Namen als Source-Eigenschaft des Ereignisprotokolls festlegen und auf diese Weise die korrekte Protokollierung der Ereignisse sicherstellen.
Wenn mehrere Codezeilen in einer Multithreadumgebung ausgeführt werden, ist es wichtig, dass die Threads vor der Ausführung von Code eine exklusive Sperre für das Ereignisprotokoll erhalten. Sehen Sie sich z. B. die folgenden Codezeilen an, die in einer Multithreadumgebung ausgeführt werden:
MyEventLog.Source = Threading.Thread.CurrentThread.Name.ToString
EventLog.WriteEntry("What thread did this come from?", "myApplication")
MyEventLog.Source = System.Threading.Thread.CurrentThread.Name.ToString();
EventLog.WriteEntry("What thread did this come from?", "myApplication");
Wenn diese Zeilen von mehreren Threads gleichzeitig ausgeführt werden, kann es passieren, dass ein Thread die EventLog.Source-Eigenschaft des Ereignisprotokolls ändert und ein anderer Thread eine Meldung schreibt, nachdem diese Eigenschaft geändert wurde. Um Situationen wie diese zu vermeiden, können Sie die SyncLock-Anweisung (Visual Basic) oder die lock-Anweisung (C#) verwenden, um eine exklusive Sperre für das Objekt zu erhalten, bevor Code aus mehreren Threads ausgeführt wird. Bei Verwendung von Sperren sieht das vorherige Beispiel in etwa folgendermaßen aus:
SyncLock MyEventLog
MyEventLog.Source = System.Threading.Thread.CurrentThread.Name.ToString
EventLog.WriteEntry("What thread did this come from?", "myApplication")
End SyncLock
lock(MyEventLog)
{
MyEventLog.Source = Threading.Thread.CurrentThread.Name.ToString();
EventLog.WriteEntry("What thread did this come from?",
"myApplication");
}
Um Ereignisse zu protokollieren, die in Multithreadanwendungen auftreten, können Sie auch die Debug-Klasse und die Trace-Klasse verwenden. Hierbei handelt es sich um statische Klassen, die es Ihnen ermöglichen, Ausgabedaten an das Ausgabefenster, das Konsolenfenster, eine Textdatei oder ein Ereignisprotokoll bzw. an ein beliebiges anderes Objekt aus einer Reihe von Objekten zu senden. Einzelheiten hierzu finden Sie unter Ablaufverfolgung und Instrumentation in Anwendungen.
Siehe auch
Aufgaben
Gewusst wie: Protokollieren von Ereignissen für Multithreadkomponenten