事件記錄檔和多執行緒元件
事件記錄檔是用來在應用程式執行時記錄重要的事件。 您可使用事件記錄檔來記錄適用於疑難排解或效能分析的資訊。 當利用多執行緒元件記錄事件時,您需要列入一些額外的考量。 第一就是必須有個機制來記錄將訊息加以記錄的執行緒的識別 (Identity)。 第二,當與事件記錄檔互動時,執行緒安全性就必須列入考量。 嘗試寫入訊息的執行緒必須取得記錄檔的獨佔鎖定以避免競爭情形。 如需事件記錄檔的概觀,請參閱管理事件記錄檔。 如需執行緒安全性的詳細資訊,請參閱安全執行緒的元件。
若要辨識每個執行緒,您應設定 Thread.Name 屬性。 這個屬性會使用並傳回 String 值,而且可用來設定每個執行緒的唯一識別項。 接著就會將這個值傳遞至 EventLog.CreateEventSource 方法,將您的執行緒指定為每個執行緒的事件來源。 當記錄事件時,您的執行緒可將事件記錄檔的 Source 屬性設定為它的名稱,這樣就能確保正確記錄事件。
當在多執行緒環境中執行多行程式碼時,您必須確定執行緒在執行任何程式碼之前取得事件記錄檔的獨佔鎖定。 例如,考慮下列在多執行緒環境中執行的程式碼行:
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");
如果多個執行緒同時執行這些程式碼行的話,那麼有可能有一執行緒先變更事件記錄檔的 EventLog.Source 屬性,而另一個執行緒在這個屬性變更之後又寫入訊息。 若要避免類似這種情形發生,您可使用 SyncLock 陳述式 (Visual Basic) 或 lock (C#) 陳述式,在多個執行緒執行程式碼之前,先取得物件的獨佔鎖定。 在使用鎖定的情況下,先前的範例現在應該像這樣:
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");
}
您也可使用 Debug 和 Trace 類別來記錄發生在多執行緒應用程式中的事件。 這些類別都是靜態 (Static) 類別,可讓您將輸出傳送至輸出視窗、主控台視窗、文字檔或事件記錄檔,或是任何其他一些物件。 如需詳細資訊,請參閱在 Visual Basic 和 Visual C# 中追蹤和測試應用程式。