Entwickler-Ecke
WinForms - Arbeitsspeicher geschlossener Forms
mats74 - Di 06.08.13 09:13
Titel: Arbeitsspeicher geschlossener Forms
Hallo zusammen
In meiner Hauptanwendung habe ich ein modulares Form, welches beim User sehr oft geöffent und wieder geschlossen wird (bis zu 50'000 mal pro Tag).
Warum das so ist, ist eine andere Geschichte.
Im Arbeitsspeicher bleiben bei jedem Schliessen dieses Forms "Reststücke" zurück, die durch den GC nicht gelöscht werden.
Folgende Methoden habe ich bereits ausgeführt, aber ohne Erfolg:
C#-Quelltext
1: 2: 3: 4:
| this.Close(); this.Dispose(); System.GC.Collect(); |
Dadurch wird der Arbeitsspeicher vollgerammelt und irgendeinmal gibt das Hauptprogramm den Geist auf.
Hat jemand eine Idee, wie ich den Arbeitsspeicher wieder freibekomme und das modulare Form entgültig vom Arbeitsspeicher lösche?
Ralf Jansen - Di 06.08.13 09:29
Wenn ein normales freigeben der Form nicht reicht wird deine Form noch von irgendwo referenziert. Nur nicht mehr referenzierte Objekte könenn wirklich richtig freigegeben werden.
| Zitat: |
| Dadurch wird der Arbeitsspeicher vollgerammelt und irgendeinmal gibt das Hauptprogramm den Geist auf. |
Mit welchen Fehler bei welcher Operation? Es macht einen Unterschied ob wirklich der Speicher voll ist oder ob irgendeine Resource verbraucht ist (WindowsHandles etc.). Eine OutOfMemoryException steht in .Net leider nicht zwingend für das was man bei dem Namen vermuten würden.
mats74 - Di 06.08.13 09:43
| Zitat: |
| ... Nur nicht mehr referenzierte Objekte könenn wirklich richtig freigegeben werden... |
Folgender Aufrug der Form habe ich:
C#-Quelltext
1: 2:
| Form2 _form2 = new Form2(this) _form2.ShowDialog(); |
Das Form wird folgendermassen geschlossen:
Durch das Schliessen der Form mit der Methode Close() sollte die Referenzierung aufgehoben sein, oder verstehe ich das falsch?
Wie kann ich eine Aufhebung der Refernzierung erzwingen?
Ralf Jansen - Di 06.08.13 10:06
Bei einem ShowDialog bietet sich immer an ein using zu benutzen. Da hast du die maximale Sicherheit das das Ding auch aufgeräumt wird.
C#-Quelltext
1: 2: 3: 4:
| using (Form2 form = new Form2(this)) { form.ShowDialog(); } |
| Zitat: |
| Wie kann ich eine Aufhebung der Refernzierung erzwingen? |
Nur indem du alle Referenzen auf die Form aufhebst. Bei deinem Code fällt z.B auf das du this an den Constructor der Form übergibst. Da hast du also irgendwas selbst gebastelt. Wenn du in diesem Constructor irgendwas gebastelt hast wodurch this dann dauerhaft einen Verweis auf die Form2 hat wird Form2 nicht mehr vollständig freigegeben egal wie oft du Close, Dispose GC.Collect aufrufst. Erst müssen alle
Alle Verweise auf die Form2 Instanz müssen weg.
mats74 - Di 06.08.13 15:22
| Zitat: |
| Bei einem ShowDialog bietet sich immer an ein using zu benutzen. Da hast du die maximale Sicherheit das das Ding auch aufgeräumt wird. |
Vielen Dank euch beiden.
Ich habe mir eure Vorschläge zu Herzen genommen und getestet.
So auf die Schnelle bin ich mit der Using-Anweisung zu sehr guten Resultaten gekommen (habe ich zu vor noch nie verwendet).
Der Arbeitsspeicher verhält sich im normalen Bereich auch bei grösseren Forms (bis zu ca. 2'500 Steuerelementen getestet).
Leider habe ich bei nicht modalen Formaufrufen schwierigkeiten den GC beim aufräumen auf die richtige Fährte zu lotzen .
Ich muss die Codestruktur mit den Aufrufen der Dialoge im Moment so stehen lassen, da der Quellcode sehr gross ist und ich die Grafik von der Logik nicht in geforderter Frist ablösen kann.
Gibt es für die nicht modularen Forms eine ähnliche Methode gemäss der using-Anweisung?
Wäre mir im Moment sehr geholfen.
Th69 - Di 06.08.13 18:06
Bei nicht-modalen Forms gibt es kein Patentrezept in der Art, sondern man muß selber alle möglichen Referenzen verwalten und entsprechend freigeben.
Hast du denn schon mal einen "Memory Profiler" dafür benutzt?
mats74 - Mi 07.08.13 08:00
Bin gerade dabei.
Der liefert mir auch die entsprechenden (misserablen) Werte :shock: .
Es bleibt mir aber im Moment keine ander Möglichkeit, als die (zu)vielen Aufrufe mit modalen Forms zu gestalten und entsprechend zu handeln.
Danach werde ich die Codesturktur zur Brust nehmen und entsprechend strukturieren, damit dieses "Gebastel" ein Ende hat :wink: .
Danke für den Hinweis.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!