我在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?