イベント ログおよびマルチスレッド コンポーネント

イベント ログはアプリケーションの実行中に重要なイベントを追跡するために使用します。 イベント ログを使用すると、トラブルシューティングまたはパフォーマンス分析に役立つ情報を記録できます。 マルチスレッド コンポーネントのイベント ログを記録するときの考慮事項がいくつかあります。 まず、メッセージ ログを記録するスレッドの ID を記録するための機構が必要です。 次に、イベント ログとのスレッドセーフな対話を考慮する必要があります。 メッセージを書き込もうとするスレッドは、ログへの排他ロックを取得して競合状態を回避する必要があります。 イベントログの概要については、「イベント ログの管理」を参照してください。 スレッドセーフの詳細については、「スレッドセーフ コンポーネント」を参照してください。

各スレッドを識別するには、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 の各クラスを使用することもできます。 これらは、出力ウィンドウ、コンソール ウィンドウ、テキスト ファイルやイベント ログ、その他多数のオブジェクトに出力を送ることができる静的クラスです。 詳細については「Visual Basic および Visual C# におけるアプリケーションのトレースと実装」を参照してください。

参照

処理手順

方法 : マルチスレッド コンポーネントのイベント ログを記録する

その他の技術情報

コンポーネントのマルチスレッド