我正在使用GDIView来尝试追踪一些滞留的GDI句柄的来源,并且该来源似乎是表单中菜单中使用的字体。我发现做的唯一的方式,以确保该字体句柄GCed是明确地将它们设置为null这样的:为什么字体句柄没有被丢弃?
tsmiTextLocation.Font = null;
tsmiLocationSelection.Font = null;
这似乎并不完全正确给我,但我不知道是怎么回事解决这个问题。有没有其他人遇到过这个问题?
我正在使用GDIView来尝试追踪一些滞留的GDI句柄的来源,并且该来源似乎是表单中菜单中使用的字体。我发现做的唯一的方式,以确保该字体句柄GCed是明确地将它们设置为null这样的:为什么字体句柄没有被丢弃?
tsmiTextLocation.Font = null;
tsmiLocationSelection.Font = null;
这似乎并不完全正确给我,但我不知道是怎么回事解决这个问题。有没有其他人遇到过这个问题?
尽管最好通过直接调用或使用using关键字自己调用IDisposable.Dispose()
。某些GDI +对象是此规则的例外。
GDI +在笔刷和笔类中包含预定义的笔刷和笔。你不应该在这些类的成员返回的对象(或者你还没有自己创建的其他GDI预缓存对象)上调用Dispose()
。
而且从MSDN一张纸条 - Font.Dispose
:
总是调用Dispose你释放你的最后一个引用字体之前。 否则,直到收集器调用Font对象的Finalize方法的垃圾 才会释放它正在使用的资源。
设置为null会使它们最终被垃圾收集,并且调用终结器。这可能需要一些时间,如果没有内存压力的对象可能会生活一段时间。
System.Drawing.Font实现了IDisposable,因此您应该调用Font.Dispose来确定性地释放所有非托管资源(GDI句柄)。
我相信你必须显式调用Dispose,因为字体可能是共享的,因此表单不能在Dispose方法中处理字体。
最佳实践是,如果类实现了IDisposable,则应该尽可能在您的实例上调用Dispose。
大多数GDI类支持IDisposable。
但是配置为字体应该用形式的dispose方法来调用吧?我没有看到任何窗体上的其他控件,其中大部分都有关联的字体对象。 – 2009-04-16 20:26:41
啊,我不知道你是在处理这个表格。 我期望的形式;处置应释放所有非托管资源。您可以尝试在调试器中的Font.Dispose上放置一个断点,并验证它是在您的窗体上发生Dispose时调用的。 – Michael 2009-04-16 20:28:43