2008-10-06 8 views
7

J'ai une exigence dans mon application que je pense peut être satisfaite en utilisant le stockage local de thread, mais je me demande si c'est l'une de ces choses qu'il vaut mieux éviter.Quelles sont les meilleures pratiques pour utiliser le stockage local de threads dans .NET?

J'ai lu quelques articles sur le sujet:

http://www.dotnetcoders.com/web/Articles/ShowArticle.aspx?article=58

http://msdn.microsoft.com/en-us/library/system.threadstaticattribute(vs.80).aspx

Je sais comment à utiliser, je me demande si je devrais utiliser.

Un conseil, faut-il être conscient de?

[Modifier]

est ici le cas d'utilisation:

J'Entonnoir tout accès aux données à travers quelques méthodes qui font beaucoup de vous connecter sur chaque requête. Une chose que je consigner est un vidage complet du texte de la commande avec les commandes remplies afin que je puisse simplement copier-coller à partir de mes journaux de suivi directement dans Sql Management Studio.

Montez dans global.asax dans mes applications Web J'envoie des courriels aux administrateurs avec autant d'informations que possible lorsque je reçois une exception non gérée. Je veux mettre ce texte de vidage de commandes sql dans cet e-mail lorsque j'obtiens une exception SqlException, ce qui me fera gagner du temps à creuser dans les journaux de trace lorsqu'une page explose à cause d'une requête. Je ne veux pas changer les signatures de méthode de mes classes d'accès aux données juste pour que je puisse passer une référence tout au long de la pile, juste pour la sortir quand j'ai une exception. Je pensais que TLS serait peut-être un bon endroit pour mettre quelque chose comme «lastsqlcommand», mais cela ne semble pas être une solution viable.

+0

J'ai toujours évité le stockage local par thread et trouvé une autre façon de faire la même chose. Ma pensée a toujours été thread-local de stockage est probablement plus lent que l'accès direct (pas sûr si c'est vrai). Je serais curieux de savoir ce que les autres pensent aussi. – dongola7

Répondre

7

Un getcha pour les applications asp.net: le traitement d'une seule requête peut changer de threads, à savoir s'il y a des requêtes parallèles dans la même session. À cause de cela, tout ce que vous mettez dans TLS avant l'événement HttpApplication.PostRequireRequestState peut ne pas être plus tard, car vous êtes sur un thread différent.

[Editer par le demandeur]

Pour mon cas particulier d'utilisation, je fini par ajouter une paire valeur-clé du dictionnaire SqlException.Data, que je récupère puis lorsque je me connecte les détails d'exception. Cela me donne la fonctionnalité que j'espérais utiliser pour le stockage local de threads.

+0

C'est exactement ce que je cherchais. Je me doutais que cela pourrait ne pas être fiable dans ce scénario. THX. –

+0

Il s'agit d'une vieille réponse, mais pour clarifier un peu: ASP.NET ne fait que basculer les threads dans des scénarios très spécifiques. Le plus important est l'utilisation des méthodes d'E/S asynchrones - voir p. Lhotka et Guthrie discutent: http://www.lhotka.net/WeBlog/PermaLink,guid,019e3c37-38ed-492e-b769-16e1a57fed0a.aspx – EBarr

6

Le stockage local de threads est un moyen rapide de réparer une bibliothèque qui a été conçue avant les threads et qui utilise un grand nombre de variables et de statistiques globales. C'est ainsi que la bibliothèque standard C a été sécurisée pour les threads sans changer son interface (en interne, de nombreuses fonctions utilisent des tampons statiques).

Généralement, c'est un bon produit pour cela. Si vous devez disposer de données globales dans un environnement multithread, le stockage local par thread est une bonne solution. Une raison courante est que vous appelez une fonction tierce qui vous rappelle dans la même pile-frame, mais qui ne vous donne pas le droit de transmettre des informations supplémentaires - cela arrive souvent lorsque vous essayez d'envelopper des bibliothèques C plus anciennes dans .NET.