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
aufliste.
Wechsel ich auf den nächsten Tag, werden die alten Einträge per
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 608367
Url: https://administrator.de/contentid/608367
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
4 Kommentare
Neuester Kommentar
Hi,
zwei Ansätze:
GC.Collect
E.
zwei Ansätze:
- Nach dem Clear explizit die Garbage Collection ausführen.
- 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.
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
in meinem Projekt, einer Projektplanersoftware, stelle ich in einem Flowlayoutpanel die Projekte eines Tages jeweils mit einem UserControll da, welches ich zur Laufzeit mit
aufliste.
Wechsel ich auf den nächsten Tag, werden die alten Einträge per
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?
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.