事件日志和多线程组件

更新:2007 年 11 月

事件日志用于在应用程序运行时记录重要的事件。使用事件日志,您可以记录可能有助于故障排除或性能分析的信息。当使用多线程组件记录事件时,还有其他注意事项。首先,必须存在对记录消息的线程的标识进行记录的机制。其次,当与事件日志进行交互时,必须考虑到线程安全。试图写入消息的线程必须获得日志上的专用锁,以避免争用状态。有关事件日志的概述,请参见管理事件日志。有关线程安全的更多信息,请参见线程安全组件

若要标识每个线程,则应设置 Thread.Name 属性。该属性采用并返回 String 值,它可用于设置每个线程的唯一标识符。然后,可以将该值传递给 EventLog.CreateEventSource Method,从而将您的线程指定为每个线程的“事件源”。当记录事件时,您的线程可以将事件日志的 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");
}

您还可以使用 DebugTrace 类记录在多线程应用程序中发生的事件。这些类是静态类,它们允许您将输出发送到输出窗口、控制台窗口、文本文件或事件日志或者其他任何一组对象。有关详细信息,请参见在 Visual Basic 和 Visual C# 中跟踪应用程序和在应用程序中插入检测点

请参见

任务

如何:记录多线程组件的事件

其他资源

组件中的多线程处理