Journaux des événements et composants multithread

Les journaux des événements assurent le suivi des événements significatifs lors de l'exécution d'une application. Les journaux des événements vous permettent d'enregistrer des informations pouvant se révéler utiles à des fins de dépannage ou d'analyse des performances. Lors de l'enregistrement d'événements avec des composants multithread, des considérations supplémentaires entrent en jeu. Il doit, tout d'abord, exister un mécanisme pour enregistrer l'identité du thread enregistrant le message. Il convient, ensuite, de prendre en compte la compatibilité des threads lors de l'interaction avec le journal des événements. Le thread tentant d'écrire un message doit obtenir un verrou exclusif sur le journal afin d'éviter toute condition de concurrence critique. Pour une vue d'ensemble des journaux des événements, consultez Gestion des journaux des événements. Pour plus d'informations sur la sécurité des threads, consultez Composants thread-safe.

Pour identifier chaque thread, vous devez définir la propriété Thread.Name. Cette propriété prend et retourne une valeur String et peut être utilisée pour définir un identificateur unique pour chaque thread. Cette valeur peut ensuite être passée à la méthode EventLog.CreateEventSource pour désigner votre thread comme source d'événements pour chaque thread. Lors de l'enregistrement d'événements, votre thread peut attribuer son nom à la propriété Source du journal des événements afin de garantir un enregistrement correct.

Lors de l'exécution de plusieurs lignes de code dans un environnement multithread, les threads doivent obtenir des verrous exclusifs sur le journal des événements avant d'exécuter du code. Considérons par exemple les deux lignes de code suivantes, exécutées dans un environnement multithread :

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

Si plusieurs threads exécutent ces lignes en même temps, l'un des threads peut modifier la propriété EventLog.Source du journal des événements et un autre thread peut alors ensuite écrire un message. Pour éviter de telles conditions, vous pouvez utiliser l'instruction SyncLock (Visual Basic) ou l'instruction lock (C#) afin d'obtenir un verrou exclusif sur l'objet avant d'exécuter le code de plusieurs threads. Avec un verrou, l'exemple précédent ressemblerait à ceci :

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

Vous pouvez également utiliser les classes Debug et Trace pour enregistrer des événements se produisant dans des applications multithread. Ces classes sont des classes statiques qui vous permettent d'envoyer la sortie à la fenêtre Sortie, la fenêtre de console, un fichier texte ou un journal des événements ou d'autres objets. Pour plus d'informations, consultez Traçage et instrumentation d'applications dans Visual Basic et Visual C#.

Voir aussi

Tâches

Comment : enregistrer des événements pour les composants multithread

Autres ressources

Multithreading dans les composants