Я отлаживал утечки ресурсов в своем приложении и создал тестовое приложение для проверки утечек объектов GDI. В OnPaint я создаю новые иконки и новые растровые изображения, не удаляя их. После этого я проверяю увеличение объектов GDi в диспетчере задач для каждого из случаев. Однако, если я продолжаю перекрашивать главное окно своего приложения, количество объектов GDI для значков увеличивается, но для растровых изображений изменений нет. Есть ли какая-то конкретная причина, по которой значки не очищаются так же, как растровые изображения?
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// 1. icon increases number of GDI objects used by this app during repaint.
//var icon = Resources.TestIcon;
//e.Graphics.DrawIcon(icon, 0, 0);
// 2. bitmap doesn't seem to have any impact (only 1 GDI object)
//var image = Resources.TestImage;
//e.Graphics.DrawImage(image, 0, 0);
}
}
Результат испытаний:
- Без значков и растровых изображений — 30 объектов GDI
- С растровыми изображениями — 31 объект GDI число не меняется.
- С иконками - 31 и то число увеличивается если перекрашивать окно.
Bitmap
обычно большой, аIcon
маленький настолько большой, чтоBitmap
запускает сборку мусора, которая очищаетBitmap
(и удаляет i> их), но неIcon
s - person Dmitry Bychenko   schedule 13.02.2015icon.ToBitmap()
. Таким образом, вам нужно будет только один раз обратиться к значку в вашем коде. - person Raheel Khan   schedule 16.03.2015