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