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时,我不知道有什么成本吗?
问题在于,只有在存在内存压力时才会进行垃圾回收。通常,非托管句柄比内存更受限制,因此您可以在GC发生之前耗尽句柄,从而导致错误。
但是对于一两个Font实例,它不会对您造成太大伤害。
更大的问题是某些对象是共享的,不应(或不能)过早处置...
简单回答:如果它只是几个,那么没有.如果它很多,那么是的.如果您的应用程序已经在强调垃圾收集器,那么是的.我会使用perfmon查看坐在周围的对象数量,并将数量提升到更高代,然后再决定.
完成后为什么不处理呢?仅仅因为我们有清道夫并不意味着我们应该到处乱扔垃圾。但是,在给出的示例中,如果在对象的生命周期中需要使用字体,则在该对象的处置中处置字体。还有很多事情可以简化我的代码,但这并不能证明这些更改是正确的-有时有些事情你应该做,尽管这很痛苦。
整理自己始终是个好主意。当您不再需要某些东西时,请丢弃它。这样,您可以避免令人讨厌的争用条件,内存不足异常,绘图故障以及冗长的处理器密集型垃圾回收。
我发现,除非有正当理由不使用一次性物品(例如您不拥有该物品),否则最好处置一次性物品。要想找到问题的根本原因,要比事先进行防御性编码要困难得多。
关于字体,MSDN说:
在释放对字体的最后引用之前,请始终致电Dispose。否则,除非垃圾回收器调用Font对象的Finalize方法,否则不会释放正在使用的资源。
它没有说资源是什么,而是它们明确指出应该隐式执行的事实,这增加了调用Dispose的重要性。
| 归档时间: |
|
| 查看次数: |
5920 次 |
| 最近记录: |