Sollte ich den Aufruf von dispose für Objekte, die die Lebensdauer des Prozesses teilen, anrufen?

8

Mir ist bewusst, dass alle Objekte, die IDisposable implementieren, gelöscht werden sollten, sobald sie nicht mehr benötigt werden, um den von ihren nicht verwalteten Ressourcen belegten Speicher freizugeben.

Meine Frage bezieht sich auf Objekte, von denen ich weiß, dass sie für eine Tatsache gelten, bis der Host-Prozess selbst beendet ist. Würde es einen Unterschied machen, wenn ich darüber verfüge oder nicht? Gibt es eine Chance, dass die Erinnerung nicht freigegeben wird, wenn der Prozess stirbt? Was ist mit GDI-Objekten? Würden die GDI-Griffe freigegeben, wenn der Prozess stirbt, selbst wenn sie nicht entsorgt wurden?

Ich verstehe vollkommen, dass es eine gute Praxis ist, alle Objekte sowieso zu entsorgen. Ich frage rein aus Neugierde.

    
Rotem 12.03.2012, 22:47
quelle

2 Antworten

7

Es hängt von dem Objekt (Ressource) in Frage ab.

Wenn ein Prozess den gesamten nicht verwalteten Speicher beendet, werden Dateihandles und andere Betriebssystemressourcen freigegeben, auch wenn die zugehörigen Finalizer nicht ausgeführt werden konnten.

Aber ich bin mir nicht so sicher über db-Handles, named-mutexes usw.

Bevor Sie also sicher sein können, nicht Dispose aufzurufen, müssen Sie über den Ressourcentyp und dessen Beziehung zum Prozess Bescheid wissen. Viel einfacher, einfach Dispose () aus dem allgemeinen Prinzip heraus aufzurufen.

Aber es ist ein theoretisches Argument, die meisten Klassen verwenden SafeHandle : CriticalFinalizerObject . Ich denke also nicht, dass es jemals ein echtes praktisches Problem ist.

    
Henk Holterman 12.03.2012, 22:53
quelle
2

Nein. Mit design steht IDisposable zur Verfügung, damit ein Programm eine nicht verwaltete Ressource früher als vom Finalizer freigegeben freigeben kann. Was zu einem ziemlich unvorhersehbaren Zeitpunkt abläuft, normalerweise später , wenn eine Garbage Collection durchgeführt wird. Sie können nicht vorhersagen, wann das passiert.

Es macht keinen Sinn, beim Beenden des Programms zu disponieren, der Finalizer wird garantiert ausgeführt, kurz bevor die AppDomain entladen und der Prozess beendet wird.

Das heißt, es gibt einen IDisposable-Missbrauch, Code, der erwartet , dass Sie ihn aufrufen. Aber das basiert normalerweise auf der Anweisung mit , daher ist es nicht so wahrscheinlich, dass Sie darauf stoßen.

    
Hans Passant 13.03.2012 00:08
quelle

Tags und Links