[ThreadStatic]
wird mit Attribut definiert, während ThreadLocal<T>
generisch verwendet wird. Warum wurden unterschiedliche Designlösungen gewählt? Welche Vor- und Nachteile hat die Verwendung von generischen Überattributen in diesem Fall?
c#
generics
attributes
thread-local
threadstatic
user2341923
quelle
quelle
Antworten:
Etwas, das der Blog-Beitrag in den Kommentaren nicht explizit macht, aber ich finde es sehr wichtig, dass
[ThreadStatic]
es nicht automatisch Dinge für jeden Thread initialisiert. Angenommen, Sie haben Folgendes:Der erste Thread, der dies verwendet, wird auf
Foo
initialisiert42
. Aber nachfolgende Threads werden nicht. Der Initialisierer funktioniert nur für den ersten Thread. Am Ende müssen Sie also Code schreiben, um zu überprüfen, ob er initialisiert ist.ThreadLocal<T>
Behebt dieses Problem, indem Sie eine Initialisierungsfunktion (wie Reeds Blog zeigt) bereitstellen, die vor dem ersten Zugriff auf das Element ausgeführt wird.Meiner Meinung nach hat die Verwendung von
[ThreadStatic]
statt keinen VorteilThreadLocal<T>
.quelle
ThreadLocal<T>
ist dies in .NET 4 und höher verfügbar, und dasThreadStatic
Attribut ist auch in Version 3.5 und darunter verfügbar.ThreadLocal<T>
implementiertIDisposable
und zwingt Sie normalerweise auch zur ImplementierungIDisposable
, was Ihre Anrufer dazu zwingt, Sie zu entsorgen und daher auch zu implementierenIDisposable
...ThreadLocal
oderThreadStatic
mit Pool-Threads sein. Diese Werte bleiben während der gesamten Lebensdauer des Pool-Threads erhalten, nicht nur für die Aufgabe, die Sie ihm zuweisen. Das kann Ihnen auf ziemlich nicht offensichtliche Weise Probleme bereiten. Weitere Informationen finden Sie unter stackoverflow.com/questions/561518/… und ähnlichen Fragen.static
? Siehe msdn.microsoft.com/en-us/library/…ThreadStatic Initialize nur für den ersten Thread, ThreadLocal Initialize für jeden Thread. Unten ist die einfache Demonstration:
quelle
Die Hauptidee hinter ThreadStatic besteht darin, für jeden Thread eine separate Kopie der Variablen zu verwalten .
Im obigen Snippet haben wir
value
für jeden Thread eine separate Kopie , einschließlich des Hauptthreads.Daher wird eine ThreadStatic-Variable in anderen Threads mit Ausnahme des Threads, in dem sie erstellt wurde, auf ihren Standardwert initialisiert.
Wenn wir die Variable für jeden Thread auf unsere eigene Weise initialisieren möchten, verwenden Sie ThreadLocal.
quelle