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

更新:2007 年 11 月

当记录多线程组件中的事件时,就应该考虑特殊注意事项了。您必须提供一种方法来标识作为事件来源的线程。还必须确保当记录事件时,线程不会互相干扰。有关详细信息,请参见 事件日志和多线程组件

在多线程应用程序中使用事件日志

  1. 声明并创建事件日志。有关详细信息,请参见 如何:创建和移除自定义事件日志

  2. 将每个线程的 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;
    
  3. 为事件日志创建新的 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");
    
  4. 将事件日志的 Source 属性设置为该线程的名称,然后调用 WriteEntry 方法。

    tss153kw.alert_note(zh-cn,VS.90).gif说明:

    确保在进行这些操作之前获得事件日志上的专用锁。

    ' 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# 创作简单的多线程组件

参考

SyncLock 语句

其他资源

组件中的多线程处理