2008-09-25 9 views
9

Die ThreadStatic attribute deklariert eine statische Variable als eindeutig pro Thread. Kennen Sie ein einfaches Muster, um solche Variablen korrekt zu entsorgen?Deterministische Entsorgung von ThreadStatic-Objekten

Was wir vor ThreadStatic verwendet 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 somit nichts darauf Bezug nimmt. Wir bevorzugen jedoch, wenn möglich, deterministische Entsorgung.

aktualisieren

ich nicht kontrollieren wirklich die Fäden direkt - Ich bin mit Microsoft CCR, die eine Threadpool hat, die Aufgaben der Fall ist. 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?

Antwort

1

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 thread statische Objekte und stattdessen ein Kontextobjekt. Dies hält den Thread-spezifischen Zustand an nur wenigen Stellen und vereinfacht solche Muster.

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 der Code benötigt, ruft die "echte" Aufgabe auf und führt dann alle notwendigen Bereinigungen durch.

+0

Ich möchte nicht nach jeder Aufgabe aufräumen. Ein beliebiger Thread in meinem Threadpool führt sequentiell viele Aufgaben aus. Der Grund für den Kontext besteht darin, eine teure Zuweisung von Datenstrukturen pro Task zu sparen. Das bedeutet, dass ich erst nach Abschluss aller Threads aufräumen kann. – ripper234