2009-04-16 58 views
2

我正在使用GDIView来尝试追踪一些滞留的GDI句柄的来源,并且该来源似乎是表单中菜单中使用的字体。我发现做的唯一的方式,以确保该字体句柄GCed是明确地将它们设置为null这样的:为什么字体句柄没有被丢弃?

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

这似乎并不完全正确给我,但我不知道是怎么回事解决这个问题。有没有其他人遇到过这个问题?

回答

6

尽管最好通过直接调用或使用using关键字自己调用IDisposable.Dispose()。某些GDI +对象是此规则的例外。

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

而且从MSDN一张纸条 - Font.Dispose

总是调用Dispose你释放你的最后一个引用字体之前。 否则,直到收集器调用Font对象的Finalize方法的垃圾 才会释放它正在使用的资源。

1

设置为null会使它们最终被垃圾收集,并且调用终结器。这可能需要一些时间,如果没有内存压力的对象可能会生活一段时间。

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

我相信你必须显式调用Dispose,因为字体可能是共享的,因此表单不能在Dispose方法中处理字体。

+0

但是配置为字体应该用形式的dispose方法来调用吧?我没有看到任何窗体上的其他控件,其中大部分都有关联的字体对象。 – 2009-04-16 20:26:41

+0

啊,我不知道你是在处理这个表格。 我期望的形式;处置应释放所有非托管资源。您可以尝试在调试器中的Font.Dispose上放置一个断点,并验证它是在您的窗体上发生Dispose时调用的。 – Michael 2009-04-16 20:28:43

0

最佳实践是,如果类实现了IDisposable,则应该尽可能在您的实例上调用Dispose。

大多数GDI类支持IDisposable。