是否可以确定终结器是否可以在某个时候在.NET中执行(备用电源中断等)?我知道GC是如何工作的,确切地说它们何时会运行是不确定的。

(搜索未显示好的答案,因此,我非常希望将这个问题与不太容易发现的实际答案合并,因此添加此问题。除此之外,我已经知道答案了,将要添加几天后,以防万一没人提到它。)

最佳答案

终结器实际上可能永远不会执行,例如Raymond Chen explains。有趣的是,在他每年的CLR周期间(就在他解释了问题的两天后)就问了这个问题:)

对于懒惰的人,(或更确切地说,一个)结论是:


正确编写的程序不能假定终结器会运行。


如果您想知道是否可以依赖终结器,这已经是您必须知道的一切:不要依赖终结器。

正如雷蒙德·陈(Raymond Chen)在链接文章中也指出的那样:


终结器是一个安全网,不是资源回收的主要手段。


如果您正在寻找如何释放资源,请查看Disposable模式。



终结器可能无法运行,例如,在以下情况下:


另一个终结器引发异常。
另一个终结器需要2秒钟以上的时间。
所有终结器合计花费40秒钟以上。
AppDomain崩溃或卸载(尽管您可以使用关键的终结器(CriticalFinalizerObject,SafeHandle或类似的东西)来规避此问题
没有垃圾收集发生
进程崩溃


(注意:时间值可能会随着时间而改变,but were certainly true some time ago。)

我猜想还有更多的事情可能导致终结器永远无法运行。最重要的是,除Chen先生的报价外,终结器是一个安全网,可以减少bug的影响,因为例如,有时会释放资源,如果您忘了明确声明,它总比没有好。

关于.net - .net终结器是否始终执行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3458177/

10-10 14:34