Re: Eine Frage zu Speicherfreigabe mit Dispose
- From: "Herfried K. Wagner [MVP]" <hirf-spam-me-here@xxxxxx>
- Date: Wed, 7 Mar 2007 18:23:40 +0100
Hallo Jan!
"Jan Baer" <jan.baer@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx> schrieb:
Wir haben bei uns die Anwendungen nach dem MVP-Prinzip aufgebaut. Der Presenter erstellt eine Instanz des Controls (ist letztendlich) der View das er Verwalten soll. Wenn jetzt der View nicht mehr gebraucht wird, wird das Control aus dem Formular entfernt und die Instanz des Presenters zerstört. Jetzt sehe ich diese Vorgehensweise aber etwas problematisch. Nach meinem Kenntnissstand sollte jede Komponente die Dispose implementiert auch mit Dispose freigeben werden
Dies sehe ich auch so (wenngleich hierzu unterschiedliche Ansichten existieren).
sondern [gemeint ist: sonst] macht das erst irgendwann der
GarbageCollector, wenn er es denn überhaupt macht.
Er macht es im Normalfall. Im Finalisierer wird normalerweise 'Dispose' aufgerufen werden, wenn es nicht bereits zuvor getan wurde.
Wenn ich das nicht kann, weil ich die Instanz der Klasse über den gesamten Lebenszeitraum meiner eigenen Klasse brauche, muß ich irgendwann explizit die Dispose-Methode dieser Klasse aufrufen.
Der Aufruf muss nicht zwingend erfolgen. Wenn das .NET-Objekt nicht mehr erreicht werden kann, dann steht es dem GC frei, es zu zerstören. Bezüglich eines Windows Forms-Steuerelements sollte es demnach ausreichen, es aus der 'Controls'-Auflistung seines Elternsteuerelements zu entfernen und ggf. vorhandene Verweise, die ein Zerstören durch den GC verhindern könnten, zu entfernen.
Da ich das ja nicht unbedingt weiss, ist die optimalste Lösung nach meiner Meinung, das die Presenterklasse selbst die Dispose-Schnittstelle implementiert und wenn sie selbst durch Dispose freigegeben wird, die Dispose-Methode des Controls das es verwaltet aufruft. (Es sei jetzt mal dahin gestellt, ob das die richtige Lösung ist, das die Presenter-Klasse eine Instanz der View-Klassse erstellt)
Dies wäre eine mögliche Lösung, da die Klasse implizit (nämlich in einem von ihr angelegten Objekt) unverwaltete Ressourcen verwaltet.
Das von mir eben beschriebene Szenario mit der expliziten Dispose-Methode haben wir leider so nicht umgesetzt. Welche Folgen kann das ganze jetzt haben? Werden die von den Controls gehaltenen Resourcen irgendwann durch den GC freigegeben, oder werden diese nie freigegeben und wir haben dadurch einen typischen Memoryleak geschaffen?
Die Ressourcen können freigegeben werden, wenn das Steuerelement irgendwie vom Formular entfernt wird und der Verweis auf das 'Presenter'-Objekt aufgegeben wird.
Mein Kollege ist der Meinung, das man Dispose nur aufrufen muss, wenn man Unmanaged Resourcen hält.
Das ist ja, soweit ich dein Beispiel verstehe, implizit der Fall.
Jetzt denke ich mal, das die Winforms-Control nicht nur mit
Managed Code gezeichnet und verwaltet werden, sondern auch
Unmanaged-Handles halten, oder sehe ich das falsch.
Vollkommen richtig.
In einem von uns verwendeten Control wird außerdem eine Instanz des IE-Browsercontrols gehalten, was ja an und für sich schon mal eine unmanaged COM-Komponente ist.
Vollkommen richtig.
--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>
.
- References:
- Eine Frage zu Speicherfreigabe mit Dispose
- From: Jan Baer
- Eine Frage zu Speicherfreigabe mit Dispose
- Prev by Date: Drag&Drop zum Explorer
- Next by Date: Re: Word 2003 Dokument aus C# Amwendug aufrufen und Speicherortparameter Übergeben
- Previous by thread: Eine Frage zu Speicherfreigabe mit Dispose
- Next by thread: Re: Eine Frage zu Speicherfreigabe mit Dispose
- Index(es):
Relevant Pages
|