Fragensteller
Datagridview sorgt für Speicherprobleme

Frage
-
Hallo zusammen,
ich habe ein DataGridView das zur Hälfte über eine BindingSource befüllt wird und zur anderen Hälfte aus ungebundenen Spalten besteht.
Die ungebunden Zellen befülle ich über die Methode fillUnboundCells. Ausserdem gibt es eine Combobox bei der man die Ergebnisse Filtern kann um darauf hin wieder die ungebundenen Spalten zu füllen wird fillUnboundCells erneut aufgerufen.
Was mir aufgefallen ist, dass je häufiger ich filtere, also je häufiger fillUnboundCells aufgerufen wird umso mehr Speicher benötigt das Programm im TaskManager ausserdem dauert der dispose-Befehl länger.
Lässt sich dieses volllaufen des Speichers irgendwie beheben ?
private void fillUnboundCells() { SqlConnection con = new SqlConnection(Global.sql_Database); string strSQL_command = @"SELECT test FROM testtable;"; SqlCommand cmd_getTable = new SqlCommand(strSQL_command, con); con.Open(); SqlDataAdapter da = new SqlDataAdapter(strSQL_command, con); System.Data.DataSet ds = new DataSet(); da.fill(ds); fillCells(ds); con.Close(); } private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e) { if (toolStripComboBox1.SelectedItem.ToString() != "SHOW ALL") { BindingSource.Filter = string.Format("Country = '{0}'",toolStripComboBox1.SelectedItem.ToString() ); fillUnboundCells(); } else { BindingSource.RemoveFilter(); fillUnboundCells(); } } }
Alle Antworten
-
Hi Jaran,
das SQLDataAdapte implementiert auch Dispose, schau mal ob du den Aufruf auch für Alle Klassen machst.
Was bei fillCells(ds) gesschieht kann ich jetzt nicht sagen.
Der Speicher wird übrigens nur freigegeben wenn der GC läuft. Du kannst zum Test mal GC.Collect aufrufen. Was aber auf jeden Fall wider entfernt werden muss. Der Task Manager ist auch nicht wirklich genau was den Speicher verbrauch angeht.
Was die Laufzeit von Dispose angeht, die sollte eigentlich ungefähr gleich bleiben. Wie mist du denn da die Zeit und bei welcher Klasse rufst du Dispose auf, bis auf das Close sehe ich da jetzt nichts im Quellcode.
MFG
Björn
-
Hi Björn,
ich messe die Zeit eher grob durch das gucken auf die Uhr.
Das ganze Fenster braucht ohne die ungebundenen zellen keine Sekunde zum schließen, mit den ungebunden Zellen ca 5Sekunden und durch mehrfachen Setzen des Filters steigt die Dauer proportional zur menge des gebrauchten Arbeitsspeichers im taskmanager also bei doppelt soviel gebrauchten Arbeitsspeicher dauert das schließen ca. 10 sekunden. Daher schließe ich auf den Zusammenhang mit den ungebundenen Zellen.
Frage ist ob sich dieses beheben lässt. Ein GC.Collect hat übrigens leider keinen Effekt.
-
Hi wenn der Aufruf von GC.Collect keine Wirkung zeigt, wirst du noch irgendwo Referenzen auf den Objekten haben. So das der GC den Speicher nicht freigeben kann. Das wird aber an einer anderen Stelle sein, als indem von dir Angegebenen Quellcode.
Die Dauer von einem Dispose Aufruf und dem schließen einer Anwendung ist natürlich was anderes. Beim schießen der Anwendung wird der ganze Speicher wider Freigegeben.
MFG
Björn