Проблемы с памятью в Winforms ImageList - PullRequest
1 голос
/ 12 октября 2010

У меня есть ImageList, который заполнен, как вы уже догадались, изображениями. Эти изображения загружаются в память в наборе данных как Bitmap. Пока я не загрузил их в ImageList, рост памяти не беспокоит. Но когда они добавляются в ImageList, память использует небесные ракеты. Но самая большая проблема заключается в том, когда я должен перезагрузить список изображений. Я пытался вызвать dispose для каждого изображения в списке, но память не освобождается. Вот код, который я пытался очистить память:

        foreach (Image item in imageList.Images)
        {
            item.Dispose();

        }
        imageList.Images.Clear();

        GC.Collect();

Что я делаю не так?

1 Ответ

5 голосов
/ 12 октября 2010

Ваш код утилизации не подходит. Итерирование коллекции изображений фактически создает новое растровое изображение для каждого изображения. Который вы потом сразу же утилизируете снова. Просто позвоните Clear ().

GC.Collect () также не может иметь никакого эффекта, класс ImageList является оболочкой для собственного компонента Windows. Который хранит изображения в собственной памяти, а не в сборщике мусора.

Последняя, ​​но не менее важная проблема: диспетчер памяти Windows просто не работает так, как вы думаете. Он не уменьшает размер виртуальной памяти программы, когда освобождает память. Он просто помечает блок памяти как неиспользуемый и добавляет его в список свободных блоков. Готов к повторному использованию в более позднее время. Только в очень редком случае, когда освобождаемая память охватывает весь набор зарезервированных страниц памяти, она может уменьшить размер виртуальной памяти. Это не настоящая проблема. Это виртуально.

...