Mdi Children

MikeBi

Mitglied
Hallo,

ich habe ein Mdi-Formaular. In diesemFormular werden verschiedene Forms geöffnet. Es sollte immer nur ein Formular geöffnet sein. Also mache ich ein Close auf das zu schließende Formular und öffne das neue Formular. Aber die resourcen werden von dem zu schließenden Formular nicht freigegeben. Der Speicherverbauch der Anwendung wächst bei jedem öffnen eines Formulars. Ich habe es schon mit Dispose versucht.
Hier mall die Kurzfassung meines Codes. Eine weiter Refererenz auf das ChildrenForm habe ich meines Wissens nach nicht.

Code:
Private Sub Show_Form(ByVal Open_Form As Form)

    Dim AF As Form = Nothing
    AF = Me.ActiveMdiChild

    Open_Form.MdiParent = Me
    Open_Form.WindowState = FormWindowState.Maximized
    Open_Form.Show()

   AF.Close()
  'AF.Dispose Test
  'AF = Nothing Test
 End Sub

Ich habe keine Idee was ich falsch mache. Ich hoffe, ihr habt noch ein paar Ideen.

Mike
 
Soweit ich weiß unterscheiden sich Form.Dispose und Form.Close nicht. Wenn du nur verwaltete Ressourcen verwendest, dann musst du dir über den Speicherverbrauch keine Gedanken machen. der GarbageCollector verwaltet das für dich. Es ist nicht vorhersagbar, wann der GarbageCollector die von dir nicht mehr verwendeten Ressourcen wieder freigibt - aber du kannst dich drauf verlassen, dass er es zu einem sinnvollen Zeitpunkt tut. Wenn du dein Programm komplett beendest dann solltest du in der Regel sehen, dass wieder mehr freier Arbeitsspeicher vorhanden ist.

Edit: Es gibt doch einen Unterschied wie ich gerade in der MSDN lese
MSDN hat gesagt.:
Ein Formular wird ausschließlich dann bei Close nicht freigegeben, wenn es Teil einer MDI (Multiple Document Interface)-Anwendung ist und das Formular nicht angezeigt wird. In diesem Fall müssen Sie Dispose manuell aufrufen, um alle Steuerelemente des Formulars für die Garbage Collection zu kennzeichnen.
Ich frage mich warum das so ist.
MSDN hat gesagt.:
Dispose wird automatisch aufgerufen, wenn das Formular mit der Show-Methode angezeigt wird. Wenn eine andere Methode, z. B. ShowDialog, verwendet wird oder das Formular nie angezeigt wird, müssen Sie Dispose manuell in der Anwendung aufrufen.
Trotzdem glaube ich nicht, dass du ein tatsächliches Speicherproblem hast. Oder verwendest du unverwaltete Ressourcen (z.B. durch eine externe Nicht-.Net-DLL)?
 
Zuletzt bearbeitet:
Also ich habe jetzt mal einige Fensterwechsel gemacht und bin jetzt bei ca. 500 MB Speicherverbrauch. Auch nach dem ich die Anwendung 10 min in Ruhe gelassen habe, ist der Speicherverbrauch nicht gesunken. Sollte der GarbageCollector nicht in der Zwischenzeit mal zugeschlagen haben.

Mike
 
Wie viel RAM hast du denn insgesamt? 500MB ist für eine einfache WinForms-Anwendung zwar einiges, aber auch nicht sooo viel im Verhältnis zu typischen RAM-Größen.
 
Auf dem Rechner habe ich 2GB Ram. Aber das läuft auch auf Rechner mit weniger Speicher. Ich dachte, der GarbageCollector löscht zyklich Objekte die nicht mehr referenziert werden. Das sollte dann doch in der Zwischenzeit mal passiert sein. Ich habe glaube ich mal gelesen, das bei Mdi Formularen die Form nicht automatisch bei Close gelöscht wird.

Mike
 

Neue Beiträge

Zurück