Ich verwende ein DataGridView-Steuerelement in meiner app im Moment, und ich bin ein seltsames Speicherproblem mit ihm zu schlagen. Ich bin nicht mit DataBinding überhaupt, nur manuelle Bevölkerung. Die Daten, die ich in dort setzen ist nicht eine Menge überhaupt. Wir sprechen über 20 Zeilen mal 20 Spalten von Daten in der Regel am meisten.
Der Arbeitsablauf für dieses Steuerelement ist, dass ich eine ComboBox mit verschiedenen "Datensätzen" habe, die ich lade, wenn Sie sie auswählen. So eine gemeinsame Nutzung Szenario ist Zyklus durch die Datensätze in der ComboBox und sehen sie in der dataGrid rendern. Was ich sehe, ist, dass, wenn die Leute durch die Datensätze Zyklus, die app Speichernutzung springt von 100MB bis 1100MB sofort und fällt dann wieder nach unten, wenn GC kicks in. Aber wenn Sie Zyklus durch die Datensätze schnell (d.h. schneller als die GC kicks in), werden Sie aus dem Speicher laufen und die app wird sterben.
Nach der Fehlersuche habe ich herausgefunden, dass der Hauptgrund, warum der Speicher wie verrückt ansteigt, darin liegt, dass ich einige Spalten in dieser Datentabelle habe, die vom Typ Bild sind. Ich verwende sie, um ein 16x16-Symbol anzuzeigen, das den Status für diese Zeile angibt. Diese Symbole sind in einer ImageList gespeichert, und ich setze sie einfach als Wert für diese Zelle, wenn ich die Zeilen der Datentabelle ausfülle. Wenn ich die Bilder herausnehme und sie durch einfachen Text ersetze, sehe ich absolut keine Speicherspitzen.
Worum geht es hier also? Warum verursachen Bilder, winzige 16x16, die Kontrolle zu gehen verrückt auf meine mit Speicher wie das?
Mehr Informationen:
Meine Logik ist, dass Sie die Datensätze wechseln:
- Alle Zeilen des Gitters löschen: dataGrid.Rows.Clear();
- Alle Spalten löschen: dataGrid.Columns.Clear();
- Fügen Sie die Spalten zum DataGrid-Steuerelement hinzu: (die meisten vom Typ String, und einige DataGridViewImageColumn)
- Fügen Sie die Daten, die ich habe, zeilenweise mit dataGrid.Rows.Add(object[] data); (die Daten enthalten die Bilder, die ich als Symbole verwenden muss).