Frage

Ich habe eine Verpflichtung in meiner Anwendung, die ich denke, kann mit lokalen Threadspeicher erfüllt werden, aber ich frage mich, ob es eine jener Dinge, die am besten zu vermeiden.

Ich habe ein paar Artikel über das Thema gelesen:

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

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

Ich weiß wie , es zu benutzen, ich frage mich nur, wenn ich sollte verwenden.

Jede Beratung, zu gotchas beachten?

[Bearbeiten]

Hier ist der Anwendungsfall:

I Trichter alle Datenzugriff durch ein paar Methoden, die eine Menge der Protokollierung über jede Abfrage tun. Eine Sache, die ich lüge ist ein komplettes Abbild des Befehlstextes mit Befehlen in so gefüllt, dass ich einfach copy-paste aus meinen Trace-Protokollen direkt in SQL Management Studio.

Weg nach oben in global.asax in meiner Web-Anwendungen Ich E-Mail-Administratoren mit so viel Informationen senden, wie ich kann, wenn ich eine nicht behandelte Ausnahme erhalten. Ich möchte, dass SQL-Befehl Dump Text in diese E-Mail setzen, wenn ich ein SqlException bekommen, die mir die Zeit Graben durch Trace-Protokolle speichern, wenn eine Seite aufgrund einer Abfrage sprengt.

Ich will nicht die Methodensignaturen meiner Datenzugriffsklassen kann ich den ganzen Weg hinunter den Stapel einen Hinweis geben Sie einfach so ändern, nur um es zu bekommen, wenn ich eine Exception. Ich dachte, vielleicht würde TLS ein guter Ort sein, etwas zu setzen, wie „lastsqlcommand“, aber das ist nicht aussehen wie eine tragfähige Lösung.

War es hilfreich?

Lösung

Gotcha für asp.net Anwendungen: die Verarbeitung einer einzelnen Anforderung könnte Fäden wechseln, nämlich wenn es parallele Anfragen in derselben Sitzung. Aus diesem Grunde, alles, was Sie in TLS setzen vor dem HttpApplication.PostRequireRequestState Ereignisse später nicht da sein könnte, weil man auf einem anderen Thread ist.

[Bearbeiten durch die Fragesteller]

Für meinen speziellen Anwendungsfall, landete ich einen Schlüssel-Wert-Paar zum SqlException.Data Wörterbuch Aufsummierung, die ich dann abrufen, wenn ich die Ausnahmedetails protokollieren. Das gibt mir die Funktionalität, die ich hatte gehofft, Gewinde verwenden lokale Speicher für.

Andere Tipps

Thread-Lokalspeicher ein schneller Weg ist, eine Bibliothek zu beheben, bevor Threads entworfen und verwendet eine Menge von globalen Variablen und Statik. Es ist die Art und Weise, dass die C-Standardbibliothek wurde Thread-sicher gemacht, während nicht seine Schnittstelle zu ändern (intern verwenden viele Funktionen statische Puffer).

Im Allgemeinen ist es irgendwie gut für diesen Zweck. Wenn Sie globale Daten in einer Multithread-Umgebung haben, dann lokale Thread-Speicher ist ein guter Weg zu gehen. Ein häufiger Grund ist, dass Sie eine Drittanbieter-Funktion aufrufen, die Sie wieder in der gleichen Stack-Frame ruft aber nicht Sie einen Haken für das Bestehen zusätzliche Informationen geben - das ist eine Menge passiert, wenn Sie versuchen, ältere C-Bibliotheken umwickeln .NET.

Haben Sie einen Blick auf neue .net 4 Thread Klasse mit einem Beispiel, weitere Informationen hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top