安全与非托管手柄
工作可靠释放非托管手柄而不约束的执行区域(的CER)是不可能的。由于ThreadAbort
或OutOfMemory
例外可能会出现在您的终结器中,您总是会遇到竞争状况。所以你需要使用CERs。
CriticalFinalizerObject
在内部使用约束执行区域,在最终化过程中优先化,还有一些其他功能使得它“相对容易”相对容易,并且在需要时总是释放非托管资源。一般情况下,你应该从SafeHandle
或CriticalFinalizerObject
派生手柄握住非托管对象。这样你就知道当物体被垃圾收集时它们会被清理干净,即使它是一种不寻常的关机情况,如ThreadAbortException
。
使用什么()和IDisposable的增加
using()
和IDisposable模式让你急切地释放非托管资源 - 如您使用的是他们做尽快。如果你不用using()
来处理你的对象,他们会坚持到下一次垃圾收集。这是低效率的。
所以CriticalFinalizerObject
是关于如何确保非托管资源最终释放而using()
是关于如何确保非托管资源被迅速释放。两者应该一起使用。
另外using()
适用于纯粹的托管代码,例如,如果您正在缓存一个对象池,则Dispose()
可以将对象返回到池中。
GC
压实堆可以更有效,因为持续时间长的对象最终都挤在一起时压实堆。在.NET Framework中,只有最低的一代(最近创建的对象)被严格压缩。 Theres在引擎盖下进行了很多优化。阅读起来很有趣,但对于完成工作并不重要。如果您想了解更多信息,请搜索关于“世代垃圾收集”的文章。
感谢所有的意见。倾听来自你们的想法,帮助很多!谢谢!! :) – 2009-11-09 05:26:26