为什么没有处理Font Handles?

时间:2009-04-16 20:07:21

标签: c# .net winforms

我正在使用GDIView来尝试追踪一些挥之不去的GDI句柄的来源,而源似乎是在表单上的菜单中使用的字体。我发现确保字体句柄是GCed的唯一方法是将它们显式设置为null,如下所示:

tsmiTextLocation.Font = null;
tsmiLocationSelection.Font = null;

这对我来说似乎不太合适,但我不确定如何解决这个问题。还有其他人遇到过这个问题吗?

3 个答案:

答案 0 :(得分:6)

尽管最好通过直接调用{@ 1}}或利用using关键字来调用IDisposable.Dispose()。一些GDI +对象是此规则的例外。

GDI +在Brushes和Pens类中包含预定义的画笔和笔。您不应该对这些类的成员(或者您没有自己创建的其他GDI预缓存对象)返回的对象调用Dispose()

来自MSDN的说明 - Font.Dispose

  

在释放对Font的最后一个引用之前,请始终调用Dispose。   否则,它将使用的资源在垃圾之前不会被释放   collector调用Font对象的Finalize方法。

答案 1 :(得分:1)

设置为null将使它们最终被垃圾收集,并且将调用终结器。这可能需要一些时间,如果没有记忆压力,物体可能会活一段时间。

System.Drawing.Font实现了IDisposable,所以你应该调用Font.Dispose来确定性地释放任何非托管资源(GDI句柄)。

我相信您必须明确调用Dispose,因为字体可能是共享的,因此表单不能在其Dispose方法中处理该字体。

答案 2 :(得分:0)

最佳做法是,如果类实现了IDisposable,则应尽可能在实例上调用Dispose。

大多数GDI课程都支持IDisposable。