尽管使用静态字体或处理字体,Winforms GDI泄漏?

时间:2016-08-11 10:36:30

标签: .net winforms fonts gdi resource-leak

我在Winforms应用程序中有一个静态Font对象。它动态创建和销毁控件,如编辑框等。在某些情况下,Font属性是从静态(单例)Font对象分配的。尽管只有一个字体对象,但每次(!)控件都被销毁并使用相同的(!)字体对象重新创建,GDI对象计数增加1。 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属性会解析它,但如何在不泄漏的情况下指定Font?

0 个答案:

没有答案