【发布时间】:2013-04-22 03:12:38
【问题描述】:
我已经创建了一个如下所示的自定义控件。
public partial class TextBoxEx : TextBox
{
public TextBoxEx()
{
InitializeComponent();
Font = Utility.normalFont;
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
}
//A utility class to initialize font.
class Utility
{
internal static Font normalFont = new Font("Arial", 18);
}
我有两个表格 Form1 和 Form2。此 TextBoxEx 被添加到 Form2。单击 Form1 中的按钮时,我正在显示 Form2。
持续显示和关闭 Form2 会导致我的应用程序中的 GDI 泄漏。用GDI检测工具(Bear.exe)分析,发现是Font导致GDI泄漏。
我的问题是,
- 为什么调用 TextBoxEx 的 Dispose() 方法后字体没有释放。(关闭 Form2 时,会自动调用 TextBoxEx 的 Dispose() 方法)。
- 如何解决由字体引起的 GDI 泄漏? (TextBoxEx的Dispose()方法中不能调用Font.Dispose(),因为在构造函数中会抛出“Parameter is not valid”异常)。
【问题讨论】:
-
字体不应该被释放,因为它在静态 normalFont 变量中被引用。我认为这根本不是泄漏..
-
@Alex:当我评论这行代码“Font = Utility.normalFont;”时,泄漏消失了。我认为字体保留副本而不是参考。我可以通过在 TextBoxEx 的 Dispose() 方法中设置 Font=null 来解决 GD 泄漏问题。但这是个好主意吗?
-
字体是引用类型,所以不会被复制。我认为您的泄漏分析器提供了不正确的信息。阅读 Hans Passant 的回答,您在任何地方都找不到更好的专家 :)
-
@Alex:但是当我在 TextBoxEx 的 Dispose() 方法中设置 Font=null 时,GDI 泄漏消失了。我已经检查过 TaskManager。
-
有趣。无论如何,在 Dispose 中将字体设置为 NULL 就可以了。
标签: c# winforms custom-controls gdi resource-leak