Scheinbaren Speicherverlust in DataGridView
Wie Sie erzwingen, dass ein DataGridView zu release ein Verweis auf ein DataSet gebunden?
Wir haben einen ziemlich großen Datensatz angezeigt, in einem DataGridView und bemerkt, dass die Ressourcen nicht freigegeben wird, nachdem das DataGridView geschlossen wurde. Wenn der Benutzer wiederholt die Ansichten dieses Bericht Sie schließlich ein "out of memory" - Ausnahmefehler. ANTS Memory Profiler bestätigt, dass der GDV hält eine Referenz trotz dgv.DataSource
wird auf null gesetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie alle Ereignisse registriert, die auf das DataGridView-wie OnClick? Stellen Sie sicher, aufheben der Registrierung aller Ereignisse, sonst wird es nicht werden, Müll gesammelt
DataGridView
können sehen, out über Ihre Veranstaltungen - also, wenn dieDataGridView
entsorgt werden Ereignisse werden negiert. Eine bessere Frage ist: was sehen die (alten)DataGridView
...Sind Sie die Schließung der gesamten
Form
? oder einfach nur dieDataGridView
? Ich Frage mich, ob dies ist ein Cache in derBindingContext
. Sie könnten versuchen, mit einem neuen binding-Kontext proDataGridView
?Auch; wie immer, überprüfen Sie, Veranstaltungen etc. - insbesondere mit aufgenommenen Variablen, wie das ist eine subtile Art und Weise, das hinzufügen einer Abhängigkeit (Hinweis: die capture-Bereiche meine, Sie könnte die Aufnahme von mehr als Sie denken, wenn Sie mit komplexen, anonyme Methoden /lambdas).
Könnten Sie brauchen, um drop-in-Profiler oder windbg zu finden, die restlichen verweisen.
Den trick zu zwingen, die "DataGridView", um die Freigabe von Ressourcen zu tun, die die Bindung durch den Vermittler-Objekt
BindingSource
.Den code dann so aussieht:
BindingSource
, aber dies ist nicht einer von Ihnen. Wenn Gegenstände nicht entsorgt werden, da Sie registriert sind, mit Veranstaltungen, mit einemBindingSource
ist nicht die Behandlung des Problems überhaupt. Auch: es gibt nur selten gute Gründe zu nennenGC.Collect()
, und dies ist nicht einer von Ihnen.GC.Collect()
ist in diesem Fall notwendig, weil der Benutzer klicken kann, durch Berichte schneller als die GC-Ressourcen frei, und die app wird bald Abstürzen, mit einer out of memory exception. Gewährt, wenn die reporting-Funktion kann umgeschrieben werden zu spielen ein wenig schöner. BTW, diese ganze Sache kam durch die classic nicht die Prüfung mit einem realistischen Datensatz 8]Rufen Sie diese deaktivieren
DataGridView1
:Wie ich es nutzen?
Ich importiert Daten aus, um
DataGridView1
und studierte dann die Inhalte und übertragen Sie es aufDataGridView2
.Damit es verwendet 2,4 GB Arbeitsspeicher und dann, nach dem Aufruf
Clear
es fiel auf normal - für mich zu 128 Kb.Wir haben gesehen, dass dieses Verhalten mit datagridviews, die als datasource enthält eine Menge Bilder, wo der datagridview geladen wird wiederholt. Einstellung der Datenquelle für das datagridview zu null und dabei ein Entsorgen auf die datasource und ein GC.Sammeln Sie vor jeder Ladung scheint Griff des Lecks.
Sollten Sie nicht legen Sie die DataGridView-Eigenschaft auf null. Rufen Sie dispose auf das DataGridView statt, um es zu reinigen sich selbst, anstatt das hinzufügen von mehr Arbeit, um die GC zu behandeln.
Auch, wenn Sie irgendwelche verwurzelt Verweise auf die DataGridView, wird es nie entsorgt werden (auch wenn Sie rufen Sie Dispose()). Die GC denkt, es ist noch am Leben. Sie sollten überprüfen Sie alle verwurzelt Referenzen - D. H. Ereignis-Handler, statische Referenz, etc. und entfernen Sie diese zuerst, bevor der Aufruf von Dispose().