sdidi
Goto Top

VB.NET Controls löschen mit clear bring Speicherüberlauf

Hallo Leute,

in meinem Projekt, einer Projektplanersoftware, stelle ich in einem Flowlayoutpanel die Projekte eines Tages jeweils mit einem UserControll da, welches ich zur Laufzeit mit

Flowlayoutpanel.cotrolls.add(uc)

aufliste.

Wechsel ich auf den nächsten Tag, werden die alten Einträge per

Flowlayoutpanel.controlls.clear 

gelöscht, anschließend neu geladen wie oben beschrieben.
Funktioniert super und schnell.

Nach dem 23. mal laden kommt es aber zu einer Exception, wenn ich das richtig analysiert habe, liegt es daran, das die Objekte aus dem Flowlayoupanel zwar entfernt, im Speicher aber nicht gelöscht werden.

Wenn ich jedes Objekt über eine Schleife aus dem Flowlayoutpanel einzeln lösche, kommt die Exception nicht mehr. Dafür dauert es natürlich irre lange.

Kennt jemand dieses Problem? Gibt es da eine Lösung für?

Vielen Dank ... Söhnke

Content-ID: 608367

Url: https://administrator.de/contentid/608367

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

emeriks
emeriks 28.09.2020 um 13:33:33 Uhr
Goto Top
Hi,
zwei Ansätze:
  1. Nach dem Clear explizit die Garbage Collection ausführen.
  2. vor dem Clear startest Du für jedes "Ober-Control" einen eigenen Threat, in welchen Du die jeweiligen "Unter-Controls" explizit leerst.

GC.Collect

E.
145916
Lösung 145916 28.09.2020 aktualisiert um 18:55:03 Uhr
Goto Top
Das manuelle Auslösen der Garbage-Collection kann man machen, ist aber very bad practice. Besser wäre es deine Controls mit der IDisposable Schnittstelle auszustatten und die Controls explizit mit Dispose freizugeben, dann passiert das auch nicht da. Noch besser wäre es dafür stattdessen ein WPF zu erstellen und die Termine als Datenquelle über eine Klassen einem Data-Control zur Verfügung zu stellen und statt selbst Controls hinzuzufügen und zu löschen dann nur noch die Objekte dem Klassen-Objekt hinzuzufügen und zu löschen, für die Darstellung sorgt dann WPF bzw. du durch dein Template. Data binding overview in WPF
mbehrens
Lösung mbehrens 28.09.2020 um 18:46:46 Uhr
Goto Top
Zitat von @sdidi:

in meinem Projekt, einer Projektplanersoftware, stelle ich in einem Flowlayoutpanel die Projekte eines Tages jeweils mit einem UserControll da, welches ich zur Laufzeit mit

Flowlayoutpanel.cotrolls.add(uc)

aufliste.

Wechsel ich auf den nächsten Tag, werden die alten Einträge per

Flowlayoutpanel.controlls.clear 

gelöscht, anschließend neu geladen wie oben beschrieben.
Funktioniert super und schnell.

Nach dem 23. mal laden kommt es aber zu einer Exception, wenn ich das richtig analysiert habe, liegt es daran, das die Objekte aus dem Flowlayoupanel zwar entfernt, im Speicher aber nicht gelöscht werden.

Wenn ich jedes Objekt über eine Schleife aus dem Flowlayoutpanel einzeln lösche, kommt die Exception nicht mehr. Dafür dauert es natürlich irre lange.

Kennt jemand dieses Problem? Gibt es da eine Lösung für?

Das ist genau so dokumentiert:

Calling the Clear method does not remove control handles from memory. You must explicitly call the Dispose method to avoid memory leaks.

Es wäre sicherlich besser, mit einer geeigneten Schleife über die Controls zu iterieren und die Methode Dispose zu verwenden.
sdidi
sdidi 28.09.2020 um 22:44:34 Uhr
Goto Top
Vielen Dank für die Antwort, das hat meine Lösung bestätigt.....