Das ThreadStatic-Attribut deklariert eine statische Variable als eindeutig pro Thread. Kennen Sie ein einfaches Muster, um solche Variablen korrekt zu entsorgen?
Was wir vor ThreadStatic benutzt haben, ist ein ThreadContextManager. Jedem Thread wurde ein ThreadContext zugewiesen, der alle Thread-spezifischen Informationen enthielt. Wir haben einige Threads erzeugt und lassen sie arbeiten. Dann, als alle fertig waren, entsorgten wir den ThreadContentManager, der wiederum alle Kontexte entsorgte, wenn sie IDisposable waren.
Ich sehe keine sofortige Möglichkeit, dieses Muster in ThreadStatic-Objekte zu übersetzen. Die Objekte werden schließlich entsorgt, weil die Threads absterben und sich somit nichts auf sie bezieht. Wir bevorzugen jedoch, wann immer möglich, eine deterministische Entsorgung.
Aktualisieren
Ich kontrolliere die Threads nicht direkt - ich verwende Microsoft CCR, das einen ThreadPool hat, der Aufgaben erledigt. Wenn alle Aufgaben erledigt sind, entsorge ich den Dispatcher (der den Threadpool enthält). Die Sache ist - ich habe am Ende der Hauptfunktion eines Threads keine Chance etwas zu tun - so kann ich die Dinge am Ende des Laufs eines Threads nicht manuell erledigen. Kann ich irgendwie auf die statischen Objekte des Threads von außerhalb des Threads zugreifen?
Sie können immer noch das Äquivalent Ihrer ThreadContextManager-Klasse verwenden, um mit der Entsorgung umzugehen. Die erzeugten Threads verfügen über dieses "Manager" -Objekt, das wiederum alle anderen statischen Thread-Objekte entfernt, die es kennt.
Ich bevorzuge relativ wenige statische Thread-Objekte und verwende stattdessen ein Kontextobjekt. Dies hält den Thread-spezifischen Zustand an nur wenigen Stellen und macht Muster wie diese einfacher.
Update: Um den Threadpool-Fall zu behandeln, könnten Sie ein Basis-Task-Objekt erstellen, das an den Thread-Pool übergeben wird. Es kann jede generische Initialisierung durchführen, die Ihr Code benötigt, ruft die "echte" Aufgabe auf und führt dann eine erforderliche Bereinigung durch.
Tags und Links .net c# multithreading dispose thread-static