В настоящее время я использую элемент управления DataGridView в своем приложении, и у меня возникает странная проблема с памятью. Я не использую DataBinding вообще, просто ручное заполнение. Данных, которые я помещаю туда, совсем немного. Обычно мы говорим о 20 строках на 20 столбцов данных.
Рабочий процесс для этого элемента управления заключается в том, что у меня есть ComboBox с разными «наборами данных», которые я загружаю по мере их выбора. Таким образом, наиболее распространенным сценарием использования является циклический просмотр наборов данных в comboBox и просмотр их визуализации в dataGrid. Что я вижу, так это то, что когда люди циклически перебирают наборы данных, использование памяти приложения мгновенно скачет с 100 МБ до 1100 МБ, а затем снижается обратно при включении GC. Но если вы циклически перебираете наборы данных (т.е. быстрее, чем GC запускает в), вам не хватит памяти, и приложение умрет.
После отладки я обнаружил, что ОСНОВНАЯ причина, по которой память скачет как сумасшедшая, заключается в том, что у меня есть несколько столбцов в этой сетке данных, которые имеют тип изображения. Я использую их для отображения значка 16x16, который указывает на статус для этой строки. Эти значки хранятся в ImageList, и я просто устанавливаю их в качестве значения для этой ячейки, когда заполняю строки таблицы данных. Если я вынимаю изображения и заменяю их простым текстом, я не вижу абсолютно никаких всплесков памяти.
Так в чем же дело? Почему изображения, крошечные 16x16, приводят к тому, что управление сходит с ума по моей памяти?
Подробнее:
Моя логика при переключении наборов данных:
- Очистить все строки сетки: dataGrid.Rows.Clear ();
- Очистить все столбцы: dataGrid.Columns.Clear ();
- Добавление столбцов в элемент управления dataGrid: (наиболее тип строки и некоторые DataGridViewImageColumn)
- Добавить данные у меня строка за строкой, используя dataGrid.Rows.Add (object [] data); (данные включают изображения, которые мне нужно использовать в качестве значков).