2009-11-11 12 views
10

Ich habe festgestellt, dass System.Threading.Thread einen Finalizer implementiert, aber nicht IDisposable. Die empfohlene Vorgehensweise besteht darin, IDisposable immer dann zu implementieren, wenn ein Finalizer implementiert wird. Jeffrey Richter wrote dass die Richtlinie "sehr wichtig ist und immer ohne Ausnahme befolgt werden sollte".Warum implementiert Thread IDisposable nicht?

Warum also Thread IDisposable nicht implementieren? Es scheint, als wäre die Implementierung von IDisposable eine nicht brechende Änderung, die eine deterministische Bereinigung der finalisierbaren Ressourcen von Thread ermöglichen würde.

Und eine verwandte Frage: Da Thread finalisierbar ist, muss ich Referenzen auf laufende Threads halten, um zu verhindern, dass sie während der Ausführung abgeschlossen werden?

Antwort

8

Was würde die Entsorgung eines Thread Objekts tun? Die "Ressource" hat in diesem Fall eine natürliche Säuberung - die Fadenveredelung. Beachten Sie, dass auch das Gefühl des Besitzes fehlt ... Innerhalb des ausführenden Threads können Sie immer Thread.CurrentThread verwenden, so dass nur dieser Thread wirklich irgendeine Art von Besitz beanspruchen könnte.

Grundsätzlich denke ich Thread ist ein etwas ungewöhnlicher Fall - es gibt eine Lebensdauer für die zugrunde liegende Ressource, aber es ist nicht etwas, das explizit bereinigt werden sollte.

+0

Da ManagedThreadID eine ganze Zahl ist und gelesen werden kann, noch bevor ein Thread gestartet wird, würde das bedeuten, dass etwas zugewiesen wird, wenn ein Thread erstellt wird (selbst wenn nur die Nummer selbst). Während es für eine Anwendung seltsam wäre, 2 + Milliarden Threads-Objekte zu erzeugen, würde es scheinen, dass die Ids eine Ressource wären, die es wert wäre, freigegeben zu werden. – supercat

+0

@supercat: Interessanter Punkt. 'ManagedThreadId' scheint sequenziell zugewiesen zu werden - ich weiß nicht, was passieren würde, nachdem Sie mehr als 2 Milliarden davon erstellt haben. –

+0

Die ids scheinen wiederverwendet zu werden, wenn Thread-Objekte für die Finalisierung in Frage kommen. Daher vermute ich Threading.Thread implementiert Finalize, aber nicht IDIsposable. – supercat

3

Das liegt wahrscheinlich daran, dass Sie nicht eines Threads entsorgen können. Stattdessen können Sie es bitten, mit Abort() oder ähnlich zu sterben.

+0

Sie können aber im Allgemeinen die Verwendung von Abort nicht als gute Praxis betrachten - stellen Sie einfach sicher, dass die Thread-Methode zurückkehrt (mit einem bool oder ähnlichem) und das System macht den Rest frei. –

1

Das ist eine Art Designfrage, also kann jeder, der nicht an diesem Aspekt von .NET beteiligt war, nur spekulieren. Davon abgesehen, this blog post einen guten Punkt macht:

... Umsetzung IDisposable keinen Unterschied machen würde, zumindest in der aktuellen Implementierung von Thread. Ich erhöhte die Anzahl der Threads erstellt wird und die Handleanzahl sinkt an einem gewissen Punkt, so gibt es einen Mechanismus, sie ist zum Schließen

Themen reinige natürlich nach sich, also sind sie nicht eine Ressource, die verwaltet werden muss im typischen Sinne.