真的,处理字体有多重要?

Joe*_*ite 17 .net fonts gdi+ garbage-collection finalizer

我知道最好的做法是在任何实现IDisposable的对象上调用Dispose,尤其是包装有限资源的对象,如文件句柄,套接字,GDI句柄等.

但我遇到的情况是我有一个具有Font的对象,我将不得不通过几层对象检测IDisposable,并查看很多用法,以确保我总是让Font处理掉.而且我想知道这是否值得复杂.

如果Font包装了一个HFONT,那将是一回事,因为GDI资源是系统全局的.但是Font没有包装GDI句柄; 它是GDI +,它是一个完全独立的系统,据我所知,它是流程本地的,而不是像GDI那样的系统全局.与Image不同,Font不会保留文件系统资源(我知道,无论如何).

所以我的问题是:让Font收集垃圾的实际成本是多少?

我知道我会在终结器上受到轻微的打击,但如果"泄露的"字体的数量很小(比如说6个),那么真正的打击就不会引人注意.除了终结器之外,这与分配中型阵列并让GC清理它似乎没什么不同 - 它只是内存.

在让Font得到GCed时,我不知道有什么成本吗?

Mar*_*ell 5

问题在于,只有在存在内存压力时才会进行垃圾回收。通常,非托管句柄比内存更受限制,因此您可以在GC发生之前耗尽句柄,从而导致错误。

但是对于一两个Font实例,它不会对您造成太大伤害。

更大的问题是某些对象是共享的,不应(或不能)过早处置...


Dav*_*ill 5

简单回答:如果它只是几个,那么没有.如果它很多,那么是的.如果您的应用程序已经在强调垃圾收集器,那么是的.我会使用perfmon查看坐在周围的对象数量,并将数量提升到更高代,然后再决定.


Jef*_*tes 5

完成后为什么不处理呢?仅仅因为我们有清道夫并不意味着我们应该到处乱扔垃圾。但是,在给出的示例中,如果在对象的生命周期中需要使用字体,则在该对象的处置中处置字体。还有很多事情可以简化我的代码,但这并不能证明这些更改是正确的-有时有些事情你应该做,尽管这很痛苦。

整理自己始终是个好主意。当您不再需要某些东西时,请丢弃它。这样,您可以避免令人讨厌的争用条件,内存不足异常,绘图故障以及冗长的处理器密集型垃圾回收。

我发现,除非有正当理由不使用一次性物品(例如您不拥有该物品),否则最好处置一次性物品。要想找到问题的根本原因,要比事先进行防御性编码要困难得多。

关于字体,MSDN说

在释放对字体的最后引用之前,请始终致电Dispose。否则,除非垃圾回收器调用Font对象的Finalize方法,否则不会释放正在使用的资源。

它没有说资源是什么,而是它们明确指出应该隐式执行的事实,这增加了调用Dispose的重要性。

  • 您为什么不处置它?好吧,OP确实说了原因:因为它将极大地简化他的代码。 (7认同)
  • 当控件的Font属性(或Picture属性,或其他属性)设置为我拥有的对象时,在什么情况下控件会复制该对象(在这种情况下,我应该介意并让它处理) ,并且控件在什么情况下希望继续使用传入的对象?如果我有德鲁特人,那么有一种方法可以指定控件是否应该假定传入对象的所有权,但是既然没有,那么该怎么办? (2认同)
  • Control.Font属性文档没有提及所有权。实验表明,特定属性与处置无关。控件将不会释放其font属性,但不会在乎是否分配了所分配的字体(即使它在分配之前就已被分配!)。似乎,如果仅出于设置控件字体属性的目的而想要一种字体,则可以预先配置该字体,但是这有点不对劲。不过,我不确定如何最好地处理Picturebox的Image属性,因为它们确实在乎处理。 (2认同)