我正在使用GDIView来尝试追踪一些挥之不去的GDI句柄的来源,而源似乎是在表单上的菜单中使用的字体。我发现确保字体句柄是GCed的唯一方法是将它们显式设置为null,如下所示:
tsmiTextLocation.Font = null;
tsmiLocationSelection.Font = null;
这对我来说似乎不太合适,但我不确定如何解决这个问题。还有其他人遇到过这个问题吗?
答案 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。