Laden...

Freigeben eines Objekts, wenn dessen Parent mit Dispose zerstört wurde

Erstellt von mygil vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.365 Views
Thema geschlossen
M
mygil Themenstarter:in
124 Beiträge seit 2009
vor 10 Jahren
Freigeben eines Objekts, wenn dessen Parent mit Dispose zerstört wurde

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!

49.485 Beiträge seit 2005
vor 10 Jahren

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

F
10.010 Beiträge seit 2004
vor 10 Jahren

@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.

  1. Wenn du Objekte erzeugst die IDisposable implementieren, dann hat das seinen Grund das sie das tun, also benutze es auch richtig.
  2. Deshalb setzt man wo möglich auch Using ein.
  3. Sollte jedes Object das wiederum IDisposable's beinhaltet im eigenen Dispose dafür sorgen das aufgeräumt wird.

Also implementiere IDisposable richtig und die Frage stellt sich nicht mehr.

M
mygil Themenstarter:in
124 Beiträge seit 2009
vor 10 Jahren

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

49.485 Beiträge seit 2005
vor 10 Jahren

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

Thema geschlossen