Si MyCollection
sowieso in den Müll wandert, sollten Sie es nicht entsorgen müssen. Dadurch wird die CPU mehr als nötig beansprucht, und es kann sogar vorkalkulierte Analysen, die der Garbage Collector bereits durchgeführt hat, ungültig machen.
Ich benutze IDisposable
um z. B. sicherzustellen, dass Threads korrekt entsorgt werden, zusammen mit nicht verwalteten Ressourcen.
EDIT Als Antwort auf Scotts Kommentar:
Der einzige Zeitpunkt, zu dem die GC-Leistungsmetriken betroffen sind, ist der Aufruf von GC.Collect()".
Der GC verwaltet einen Überblick über den Objektreferenzgraphen und alle Verweise auf diesen Graphen in den Stackframes der Threads. Dieser Heap kann recht groß sein und viele Seiten des Speichers umfassen. Zur Optimierung speichert der GC seine Analyse von Seiten, die sich wahrscheinlich nicht oft ändern, im Cache, um ein unnötiges erneutes Scannen der Seite zu vermeiden. Der GC wird vom Kernel benachrichtigt, wenn sich Daten auf einer Seite ändern, so dass er weiß, dass die Seite verschmutzt ist und neu gescannt werden muss. Wenn sich die Sammlung in Gen0 befindet, ist es wahrscheinlich, dass sich auch andere Dinge auf der Seite ändern, aber in Gen1 und Gen2 ist dies weniger wahrscheinlich. Dem Team, das den GC auf den Mac portiert hat, um das Silverlight-Plug-in auf dieser Plattform zum Laufen zu bringen, standen diese Hooks unter Mac OS X anekdotischerweise nicht zur Verfügung.
Ein weiterer Punkt gegen die unnötige Entsorgung von Ressourcen: Stellen Sie sich eine Situation vor, in der ein Prozess entladen wird. Stellen Sie sich auch vor, dass der Prozess schon einige Zeit läuft. Wahrscheinlich sind viele der Speicherseiten dieses Prozesses auf die Festplatte ausgelagert worden. Zumindest befinden sie sich nicht mehr im L1- oder L2-Cache. In einer solchen Situation macht es für eine Anwendung, die entladen wird, keinen Sinn, all diese Daten- und Codeseiten wieder in den Speicher auszulagern, um Ressourcen "freizugeben", die beim Beenden des Prozesses ohnehin vom Betriebssystem freigegeben werden. Dies gilt für verwaltete und sogar für bestimmte nicht verwaltete Ressourcen. Nur Ressourcen, die Nicht-Hintergrund-Threads am Leben erhalten, müssen entsorgt werden, sonst bleibt der Prozess am Leben.
Nun gibt es während der normalen Ausführung ephemere Ressourcen, die korrekt aufgeräumt werden müssen (wie @fezmonkey anmerkt Datenbankverbindungen, Sockets, Fenstergriffe ), um unkontrollierte Speicherlecks zu vermeiden. Dies sind die Arten von Dingen, die entsorgt werden müssen. Wenn Sie eine Klasse erstellen, die einen Thread besitzt (und mit besitzt meine ich, dass sie ihn erstellt hat und daher dafür verantwortlich ist, dass er anhält, zumindest nach meinem Kodierungsstil), dann muss diese Klasse höchstwahrscheinlich Folgendes implementieren IDisposable
und reißt den Faden während Dispose
.
Das .NET-Framework verwendet die IDisposable
Schnittstelle als Signal, ja sogar als Warnung, an die Entwickler, dass die Klasse muss entsorgt werden. Ich kann mich an keine Typen im Framework erinnern, die IDisposable
(ausgenommen explizite Schnittstellenimplementierungen), bei denen die Entsorgung optional ist.