2009-12-14 9 views
1

Aucun des exemples sur TraceSource J'ai trouvé des adresses multithreading. Je crée une nouvelle instance d'une classe (SyncService) pour répondre à une requête entrante. Quand il y a beaucoup d'activité, il y a plusieurs threads qui ont besoin d'utiliser TraceSource pour enregistrer les activités. Comment dois-je utiliser cette classe pour la journalisation avec la performance et la sécurité des threads à l'esprit? J'ai quelques optons à l'esprit:comment instancier C# TraceSources pour consigner (multithread) l'application Web ASP.NET 2.0 (asmx ws)?

 
    private static TraceSource _source; 

    static SyncService() 
    { 
     _source = new TraceSource("mySrc"); 
    } 

dans le cas où la sécurité du fil est un problème. Il y a beaucoup de journalisation, donc je ne veux pas faire de verrous partout pour garder l'accès à la méthode TraceEvent. Qu'en est-il de supprimer les deux static-keywords? Y a-t-il beaucoup de frais généraux lorsque toutes les demandes se connectent à partir de leur propre TraceSource? Y a-t-il une meilleure solution que ces 2? états msdn: "Tous les membres publics (partagés dans Visual Basic) statique de ce type sont thread-safe.Tous les membres d'instance ne sont pas garantis être thread-safe." Que devrais-je penser à ce sujet?

Répondre

3

Define TraceSource comme celui-ci pour vous assurer obtenez seulement un exemple:

private static readonly TraceSource _source = new TraceSource("mySrc"); 

Cela fera en sorte qu'il est créé avant tout fil commence à l'utiliser, de sorte que vous êtes assuré une seule instance. TraceSource a par défaut un verrou global dans Trace.UseGlobalLock. Cela verrouille automatiquement pour vous tous les écouteurs de trace. Si elle est définie sur false, elle se verrouillera par TraceListener si l'écouteur n'est pas défini comme thread sûr à la place.

Le suivi peut être un goulot de la bouteille si la vitesse d'enregistrement est "lente" et le volume de traçage est important.

Pour garantir la vitesse maximale, vous devez utiliser le moins d'écouteurs de trace possible, assurez-vous qu'ils sont sûrs pour les threads et définissez Trace.UseGlobalLock = false. Si vous n'avez aucun contrôle sur les écouteurs ajoutés dans votre app.config, vous devez conserver le verrou global.

+0

merci! Je prévois d'utiliser uniquement TextWriterTraceListener. ce n'est pas sûr pour les threads. Je ne comprends pas pourquoi les auditeurs doivent être synchronisés. dans http://msdn.microsoft.com/en-us/library/ms228993.aspx vous ajoutez juste des écouteurs et ils apparaissent comme passifs (aucune méthode n'est appelée), toute l'action est dans TraceSource. Pourquoi n'avons-nous pas besoin de contrôler l'accès? c'est-à-dire lors de l'appel de _source.TraceEvent à partir de plusieurs threads. msdn indique clairement qu'il n'est pas sécurisé. –

+0

Si vous regardez l'implémentation de TraceEvent dans par exemple Reflector, il est clair que le verrouillage est implémenté. Mais si un TraceListener dit que c'est sûr, mais en réalité ce n'est pas le cas, alors l'affirmation "pas garanti pour être thread safe" est correcte. –