Как правильно избавиться от растровых изображений, загруженных в Control.BackgroundImage

1

Поэтому мы пытаемся настроить приложение, и во всех этих древних Winforms есть такие утверждения, как в Designer

this.btnCancel.BackgroundImage = ((System.Drawing.Image)resources.GetObject("btnCancel.BackgroundImage")));

Загруженные растровые изображения в местах, где нет элементов управления, являются частью объекта ImageList, контейнер которого расположен на нем, когда форма закрывается. dotMemory считает, что по-прежнему остается много выдающихся растровых изображений, поэтому я подозреваю, что это их растровые изображения BackgroundImage, которые не удаляются должным образом.

Я вижу два варианта, ни один из которых мне не нравится.
1) Следите за всеми элементами управления, у которых есть фоновое изображение. Вручную установите их все в null в Dispose. 2) Прокрутите каждый элемент управления на странице, если у него есть BackgroundImage, установите для него значение null.

Есть ли лучший способ сделать это?

  • 0
    Я не знаю о dotMemory, но объекты все еще там, если вы явно вызываете GC.Collect() ?
  • 1
    Что dotMemory говорит о том, кто владеет этими выдающимися ссылками? - они должны быть где-то укоренены, если они не собраны.
Показать ещё 2 комментария
Теги:
bitmap
dispose

1 ответ

0

Существует два разных разумных способа обработки управляющих фоновых изображений:

  1. Каждому элементу управления присваивается свой собственный фоновый объект. Объект должен быть удален, когда элемент управления (возможно, в обработчике для управления Disposed event).

  2. Каждому элементу управления дается ссылка на фоновое изображение, чье время жизни будет принадлежать приложению. Утилизация элемента управления не должна удалять изображение.

Поскольку Microsoft хотела разрешить подход № 2, удаление элемента управления не влияет на его фоновое изображение; как следствие, необходимо вручную удалить изображение (как отмечалось, обработчик событий - хороший способ сделать это).

Обратите внимание, что шрифты имеют проблему, сходную с элементами управления, но шрифты имеют дело с ней по-разному. Установка свойства Font для большинства элементов управления заставит их сделать снимок семейства шрифтов, размера, стиля и других характеристик, но не заставит их фактически использовать этот объект шрифта. Элементы управления могут захватывать необходимую информацию из Font даже если он был удален, поэтому не контролирует ни свой Font ни уход, если он находится. Возможно, свойство управления BackgroundImage элемента управления может вести себя аналогичным образом (только один раз используйте предоставленное изображение, к новому растровому изображению, которое будет находиться в частной собственности элемента управления и расположено, когда элемент управления), но копирование данных изображения в растровое изображение более дорогое чем копирование семейства шрифтов, размера и т.д. в новый объект Font.

  • 0
    Таким образом, кажется, что вместо того, чтобы пытаться заставить этот код фактически избавляться от фоновых изображений, мне может быть лучше изменить инициализацию? Вместо текущей одной строки загрузите ресурс в объект, который является жизненным для приложения, и проверьте каждую инициализацию формы, чтобы увидеть, существует ли она, прежде чем загружать ее.
  • 0
    @ItinerantEngineer: Это может быть хорошим подходом в тех случаях, когда это имеет смысл. Если большая часть изображений будет иметь разумную вероятность использования в течение всего жизненного цикла приложения, лучше создать их один раз и использовать их навсегда, чем пытаться загружать их только тогда, когда они видны. Однако такой подход может быть совершенно непригодным для таких вещей, как динамически генерируемые изображения, которые могут быстро устареть.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню