2009-11-12 6 views
1

Contexte: J'ai écrit une bibliothèque de journalisation générique dans .NET 3.5. Fondamentalement, le développeur doit appeler la méthode Begin() au début de la méthode et la méthode End() à la fin de la méthode. Ces méthodes ne prennent pas de paramètre - la bibliothèque utilise la trace de pile pour déterminer d'où elle vient. La bibliothèque possède une collection qui garde la trace de la pile d'appels et écrit le temps écoulé de chaque méthode.Valeur unique dans StackTrace?

Cela fonctionne très bien et j'en suis content. Mais maintenant nous voulons l'ajouter au serveur. Maintenant, nous voulons l'ajouter au serveur. Lorsque plusieurs utilisateurs sont sur le système, il existe un seul fichier journal et les traces de la pile sont regroupées. Il est impossible de dire quel fil fait quoi.

Ma question est la suivante:

est-il un moyen de récupérer une valeur unique de la classe StackTrace ou un StackFrame indivdual? Pourquoi ne pas utiliser la réflexion? J'aimerais pouvoir créer un fichier séparé pour chaque utilisateur. À tout le moins, j'aimerais pouvoir marquer chaque ligne avec la valeur unique afin que nous puissions filtrer le fichier par cette valeur lors de l'examen des traces.

Nous utilisons WCF TcpBinding comme notre protocole de communication côté serveur, si cela aide. Je suis à la recherche d'un identifiant de thread, d'un code de hachage, d'une adresse, de quelque chose permettant de distinguer l'origine de la pile d'appels.

Des idées?

Merci.

Répondre

2

Vous pouvez utiliser quelque chose associé au thread actuel - peut-être le thread id?

Les threads du pool de threads sont réutilisés, de sorte que les ID sont répétés dans le fichier journal, mais pour la durée de vie d'une paire Begin/End, ils sont associés à un seul utilisateur.

+0

Yep - 'Thread.CurrentThread.ManagedThreadId' devrait le faire correctement. –

+0

Cela a fonctionné pour moi. De plus, j'ai trouvé la propriété MethodBase.MethodHandle que j'utilise en combinaison avec ManagedThreadId. Merci! – msawtatn

0

Pour obtenir le compte d'utilisateur sous lequel l'unité d'exécution actuelle s'exécute, vous pouvez utiliser WindowsIdentity.GetCurrent().

+0

Vous pouvez également utiliser 'Thread.CurrentPrincipal.Identity'. – adrianbanks

1

Si vous avez utilisé une certaine forme de programmation orientée aspect (comme Postsharp), vous trouverez peut-être un meilleur moyen déclaratif d'obtenir les informations dont vous avez besoin. Thread.CurrentThread.ManagedThreadId vous donnerait une référence pour le thread exécutant le code à la fois, mais tous vos développeurs auraient à faire est d'appliquer un attribut à une méthode, plutôt que d'appeler Begin() et End() pour chaque méthode.