Hallo!
In meiner Anwendung öffne ich mittels dem folgenden Code eine separates Fenster:
frmLieferscheinAdd f = new frmLieferscheinAdd();
if (f.Neu() == System.Windows.Forms.DialogResult.OK)
GetAllLieferscheine();
f.Dispose();
Mit f.Dispose() möchte ich den verwendeten Arbeitsspeicher wieder freigeben.
Normalerweise klappt das auch bestens aber die BindingSource.DataSource verhaltet sich da anders! Mir ist aufgefallen, wenn ich eine BindingSource.DataSource mit Daten befülle, lässt dieser sich nur wieder freigeben wenn ich **BindingSource.DataSource = NULL ** verwende.
Meine Anwendung hat inzwischen ca. 100 Formulare.
Gibt es eine saubere und geniale Möglickeit wie man dann am besten lösen kann?
Danke für eure Hilfe!
Hallo mygil,
ein Objekt wird - vereinfacht gesagt - freigegeben, wenn es keine Referenzen mehr auf das Objekt gibt bzw. rekursiv nur Referenzen aus Objekten, auf die es keine Referenzen mehr gibt. Außerdem passiert das nicht sofort, sondern erst, wenn der GC es für nötig hält, also oft erst dann, wenn der Speicher anderweitig benötigt wird.
Der Speicher eines Objekts, für das Dispose aufgerufen wird, wird deshalb noch lange nicht vom GC weggeräumt, wenn es weiter Referenzen auf das Objekt gibt. Wenn du nach dem Dispose also noch eine Referenz auf das Form hat und das eine Referenz auf die BindingList, wird der GC nicht tätig werden (außer er erkennt sicher, dass nie wieder auf die Referenzen zugegriffen werden wird).
Wenn das Freigeben der BindingList scheitert, weil darauf noch eine Referenz besteht, dann hilft nur das Null-Setzen dieser Referenz bzw. das Null-Setzen aller Referenzen auf das Objekt, das die Referenz auf die BindingList enthält.
herbivore
@mygil:
Dispose gibt keinen Speicher frei und alleine die Frage danach zeigt das Du dich nicht mit der Speicherverwaltung als solcher und bei dem Code auch nicht mit dem Disposable Pattern beschäftigt hast.
Also implementiere IDisposable richtig und die Frage stellt sich nicht mehr.
ein Objekt wird - vereinfacht gesagt - freigegeben, wenn es keine Referenzen mehr auf das Objekt gibt bzw. rekursiv nur Referenzen aus Objekten, auf die es keine Referenzen mehr gibt. Außerdem passiert das nicht sofort, sondern erst, wenn der GC es für nötig hält, also oft erst dann, wenn der Speicher anderweitig benötigt wird.
Dafür habe ich mir einen [Button] mit GC.Collect() gebaut bzw. lass ich mir damit aktuellen Arbeitsspeicherverbrauch anezigen.
Wenn du nach dem Dispose also noch eine Referenz auf das Form hat und das ...
Kannst du mir sagen wass ich machen muss damit ich nach Dispose() keine Referenz mehr auf die Form: "frmLieferscheinAdd" habe?
Gilbert
Hallo mygil,
Kannst du mir sagen wass ich machen muss damit ich nach Dispose() keine Referenz mehr auf die Form: "frmLieferscheinAdd" habe?
Es bleibt dabei: Alle Variablen, die auf die Form referenzieren, auf null setzen.
Deine Nachfrage bestätigt allerdings, was FZelle schon vermutet hat. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1.
BTW: GC.Collect entfernt nur Objekte, die bereits aufgeräumt werden können.
Siehe auch Dispose implementieren und verwenden (IDisposable). Allerdings wird es in der Regel nicht gelingen, im Dispose auch alle Referenzen zu nullen, die auf zu zerstörende Objekt bestehen. Aber zumindest kann man die Referenzen auf enthaltene Objekte nullen.
herbivore