Gewusst wie: Protokollieren von Ereignissen für Multithreadkomponenten

Aktualisiert: November 2007

Beim Protokollieren von Ereignissen aus Multithreadkomponenten müssen einige Besonderheiten beachtet werden. Sie müssen einen Weg finden, um den Thread, aus dem das Ereignis stammt, zu identifizieren. Darüber hinaus müssen Sie sicherstellen, dass die Threads sich beim Protokollieren von Ereignissen nicht gegenseitig beeinflussen. Ausführliche Informationen finden Sie unter Ereignisprotokolle und Multithreadkomponenten.

So verwenden Sie Ereignisprotokolle in Multithreadanwendungen

  1. Deklarieren und erstellen Sie das Ereignisprotokoll. Ausführliche Informationen finden Sie unter Gewusst wie: Erstellen und Entfernen benutzerdefinierter Ereignisprotokolle.

  2. Legen Sie für die Name-Eigenschaft jedes Threads einen eindeutigen Bezeichner fest.

    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. Erstellen Sie eine neue Source für das Ereignisprotokoll, und legen Sie für Name einen eindeutigen Zeichenfolgenwert fest, der mit dem Thread übereinstimmt. Ausführliche Informationen zum Erstellen einer Source finden Sie unter Gewusst wie: Hinzufügen der Anwendung als Quelle für Ereignisprotokolleinträge.

    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. Legen Sie für die Source-Eigenschaft des Ereignisprotokolls den Namen des Threads fest, und rufen Sie die WriteEntry-Methode auf.

    Hinweis:

    Sie müssen eine exklusive Sperre für das Ereignisprotokoll erhalten, bevor Sie diese Operationen fortsetzen.

    ' 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");
    }
    

Siehe auch

Aufgaben

Gewusst wie: Erstellen und Entfernen benutzerdefinierter Ereignisprotokolle

Gewusst wie: Schreiben von Einträgen in Ereignisprotokolle

Gewusst wie: Koordinieren mehrerer Ausführungsthreads

Exemplarische Vorgehensweise: Erstellen einer einfachen Multithreadkomponente mit Visual Basic

Exemplarische Vorgehensweise: Erstellen einer einfachen Multithreadkomponente mit Visual C#

Referenz

SyncLock-Anweisung

Weitere Ressourcen

Multithreading in Komponenten