方法 : マルチスレッド コンポーネントのイベント ログを記録する
更新 : 2007 年 11 月
マルチスレッド コンポーネントのイベント ログを記録するときには、特別に考慮が必要な事項がいくつかあります。イベント発生元のスレッドを識別する方法を指定することが必要です。また、イベント ログの記録時にスレッドが互いに干渉しないようにする必要もあります。詳細については、「イベント ログおよびマルチスレッド コンポーネント」を参照してください。
マルチスレッド アプリケーションのイベント ログを使用するには
イベント ログを宣言および作成します。詳細については、「方法 : カスタム イベント ログを作成または削除する」を参照してください。
各スレッドの 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 の作成に関する詳細については、「方法 : アプリケーションをイベント ログ エントリのソースとして追加する」を参照してください。
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"); }
参照
処理手順
チュートリアル : Visual Basic による簡単なマルチスレッド コンポーネントの作成
チュートリアル : Visual C# による簡単なマルチスレッド コンポーネントの作成