Re: Eine Frage zu Speicherfreigabe mit Dispose

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



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/>

.



Relevant Pages

  • Re: MVP with complex controls
    ... I've read Martin Fowlers well-known ... here is that I created a presenter and a view for nodes. ... I think such standard controls are manageable somehow. ... party libraries? ...
    (comp.object)
  • Re: how to refernce a folder?
    ... for terms like "reference". ... object should know about the specific UI controls. ... presenter, encapsulating all of the actual UI-specific control types, etc. ... moment to evaluate any advice against those goals. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: how to refernce a folder?
    ... I am not looking at code, but you can set reference to a folder in a project. ... The only one that knows about the UI controls is the Presenter. ... The MVP although you can decouple it and link it to a different UI, you tell me how often that's going to happen that an UI is a Web form and a Web form using the same MVP. ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: IDispatch Pointer auf Control halten
    ... Controls vorhanden sind. ... Instanz des Objektes im Speicher. ... nicht" oder ich mach irgendwas bei den com-methoden verkehrt, ...
    (microsoft.public.de.vc)
  • Re: Verweis auf Webcontrol wird nicht aktualisiert???
    ... Ich möchte mal dringend davon abraten Controls in der Session zu speichern. ... "Klaus Holster" wrote in message ... > Hallo Rudimenter, ... > trotzdem mit der von ASP.NET erstellten Instanz arbeitet. ...
    (microsoft.public.de.german.entwickler.dotnet.asp)