为什么没有处理Font Handles?

Sha*_*mer 2 .net c# winforms

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

tsmiTextLocation.Font = null;
tsmiLocationSelection.Font = null;
Run Code Online (Sandbox Code Playgroud)

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

Joz*_*zso 6

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

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

来自MSDN的说明 - Font.Dispose:

在释放对Font的最后一个引用之前,请始终调用Dispose.否则,在垃圾收集器调用Font对象的Finalize方法之前,不会释放它正在使用的资源.