Практическое руководство. Ведение журнала событий для многопоточных компонентов
При ведении журналов событий для многопоточных компонентов следует учитывать некоторые особенности. Необходимо иметь возможность определять поток, в котором произошло событие. Нужно также гарантировать, что при ведении журналов событий потоки не будут создавать помех друг для друга. Дополнительные сведения см. в разделе Журналы событий и многопоточные компоненты.
Чтобы использовать журналы событий в многопоточных приложениях, выполните следующие действия.
Объявите и создайте журнал событий. Дополнительные сведения см. в разделе Практические примеры: Create and Remove Custom Event Logs.
Задайте для свойства Name каждого потока уникальный идентификатор.
Dim X as Integer X = 0 Dim MyThread as New Threading.Thread(AddressOf MyMethod) MyThread.Name = "Thread number " & X.ToString ' Increments X so no other threads will share the same name. X += 1
int X; X = 0; Thread MyThread = new Thread(new ThreadStart(MyMethod)); MyThread.Name = "Thread Number " + X.ToString(); // Increments X so no other threads will share the same name. X += 1;
Создайте для журнала событий новое свойство Source и задайте для свойства Name уникальное строковое значение, соответствующее потоку. Дополнительные сведения о создании свойства Source см. в разделе Практические примеры: Add Your Application as a Source of Event Log Entries.
Imports System.Threading ' Checks to see if there already is a source with the name of the ' thread. If Not EventLog.SourceExists(Thread.CurrentThread.Name.ToString, _ "myApplication") Then ' Creates a source with the name of the thread EventLog.CreateEventSource(Thread.CurrentThread.Name.ToString, _ "MyApplication") End If
// These lines go at the top of the code using System.Threading; using System.Diagnostics; // Checks to see if there already is a source with the name of the // thread. if (!EventLog.SourceExists(CurrentThread.Name.ToString())) // Creates a source with the name of the thread. EventLog.CreateEventSource(CurrentThread.Name.ToString(), "MyApplication");
Задайте имя потока в качестве значения свойства Source журнала событий и вызовите метод WriteEntry.
Примечание
Перед выполнением этих операций убедитесь в наличии монопольной блокировки для журнала событий.
' Use the SyncLock keyword to obtain an exclusive lock on an object. SyncLock MyEventLog MyEventLog.Source = Thread.CurrentThread.Name.ToString EventLog.WriteEntry(Thread.CurrentThread.Name.ToString, _ "Error in Widget 42") End SyncLock
// Use the lock keyword to obtain an exclusive lock on an object lock(MyEventLog) { MyEventLog.Source = Thread.CurrentThread.Name.ToString(); EventLog.WriteEntry(Thread.CurrentThread.Name.ToString(), "Error in Widget 42"); }
См. также
Задачи
Практические примеры: Create and Remove Custom Event Logs
Практические примеры: Write Entries to Event Logs
Практическое руководство. Координирование нескольких потоков выполнения
Пошаговое руководство. Разработка простого многопоточного компонента с использованием Visual Basic
Пошаговое руководство. Разработка простого многопоточного компонента с помощью Visual C#