Поэтому мы пытаемся настроить приложение, и во всех этих древних Winforms есть такие утверждения, как в Designer
this.btnCancel.BackgroundImage = ((System.Drawing.Image)resources.GetObject("btnCancel.BackgroundImage")));
Загруженные растровые изображения в местах, где нет элементов управления, являются частью объекта ImageList, контейнер которого расположен на нем, когда форма закрывается. dotMemory считает, что по-прежнему остается много выдающихся растровых изображений, поэтому я подозреваю, что это их растровые изображения BackgroundImage, которые не удаляются должным образом.
Я вижу два варианта, ни один из которых мне не нравится.
1) Следите за всеми элементами управления, у которых есть фоновое изображение. Вручную установите их все в null в Dispose. 2) Прокрутите каждый элемент управления на странице, если у него есть BackgroundImage, установите для него значение null.
Есть ли лучший способ сделать это?
Существует два разных разумных способа обработки управляющих фоновых изображений:
Каждому элементу управления присваивается свой собственный фоновый объект. Объект должен быть удален, когда элемент управления (возможно, в обработчике для управления Disposed
event).
Каждому элементу управления дается ссылка на фоновое изображение, чье время жизни будет принадлежать приложению. Утилизация элемента управления не должна удалять изображение.
Поскольку Microsoft хотела разрешить подход № 2, удаление элемента управления не влияет на его фоновое изображение; как следствие, необходимо вручную удалить изображение (как отмечалось, обработчик событий - хороший способ сделать это).
Обратите внимание, что шрифты имеют проблему, сходную с элементами управления, но шрифты имеют дело с ней по-разному. Установка свойства Font
для большинства элементов управления заставит их сделать снимок семейства шрифтов, размера, стиля и других характеристик, но не заставит их фактически использовать этот объект шрифта. Элементы управления могут захватывать необходимую информацию из Font
даже если он был удален, поэтому не контролирует ни свой Font
ни уход, если он находится. Возможно, свойство управления BackgroundImage
элемента управления может вести себя аналогичным образом (только один раз используйте предоставленное изображение, к новому растровому изображению, которое будет находиться в частной собственности элемента управления и расположено, когда элемент управления), но копирование данных изображения в растровое изображение более дорогое чем копирование семейства шрифтов, размера и т.д. в новый объект Font
.
GC.Collect()
?