Winforms GDI утечка несмотря на использование статического шрифта или избавление от шрифта?
У меня есть статический объект Font в приложении Winforms. Он динамически создает и уничтожает элементы управления, такие как поля редактирования и т. Д. В некоторых случаях свойство Font назначается из статического (одноэлементного) объекта Font. Несмотря на то, что существует только один объект шрифта, каждый раз (!) Элемент управления уничтожается и воссоздается с использованием одного и того же (!) Объекта шрифта, количество объектов GDI увеличивается на единицу. GDIView показывает, что это объект шрифта. Если свойство Font не назначено новому элементу управления, увеличение GDI-объекта не происходит.
Я также пытался динамически воссоздавать объект Font каждый раз, когда создается элемент управления, и утилизировать его при удалении элемента управления, но это не имеет значения.
Это ошибка в Winforms (.NET 4.5.2, VS2015, также пробовал.NET 3.5) или я что-то пропустил? Здесь много вопросов относительно утечек ресурсов GDI, но никто не ответил на мой вопрос.
Вот небольшое Winforms TestApp с одной кнопкой на нем, чтобы продемонстрировать проблему:
private const string Todelete = "todelete";
#if !DYNAMIC_FONT
static readonly Font Font = new Font("Arial", 11, GraphicsUnit.Pixel);
#endif
private void Button_Click(object sender, EventArgs e)
{
Controls.Find(Todelete, false).FirstOrDefault()?.Dispose();
var ctrl = new TextBox();
#if !DYNAMIC_FONT
ctrl.Font = Font;//leaks GDI handle every time!
#else
ctrl.Font = new Font("Arial", 11, GraphicsUnit.Pixel);
// does not help:
ctrl.Disposed += (sender2, args) => ((Control)sender2).Font.Dispose();
#endif
ctrl.Name = Todelete;
Controls.Add(ctrl);
}
Кстати. нет утечек объекта USER, поэтому элемент управления удаляется должным образом, но оба варианта пропускают объект GDI при каждом нажатии кнопки. Не назначение свойства Font разрешает его, но как я могу назначить шрифт без утечки?