【问题标题】:Are .net finalizers always executed?.net 终结器是否总是执行?
【发布时间】:2010-08-11 12:26:50
【问题描述】:

终结器是否可以保证在某些时候在 .NET 中执行(备用电源中断等)?我知道 GC 是如何工作的,而且它们运行的​​确切时间是不确定的。

(搜索没有显示好的答案,所以我添加这个问题是为了与不太容易发现的实际答案合并。除此之外,我已经知道回答并在几天后添加它,以防没有人提到它。)

【问题讨论】:

    标签: .net garbage-collection finalizer


    【解决方案1】:

    终结器实际上可能从不执行,如Raymond Chen explains。这个问题在他一年一度的 CLR 周期间被问到,这有点有趣,就在他解释这个问题的两天后 :)

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

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

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

    正如 Raymond Chen 在链接文章中所说:

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

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


    终结器可能不会运行,例如,如果:

    • 另一个终结器引发异常。
    • 另一个终结器需要 2 秒以上。
    • 所有终结器加起来需要 40 多秒。
    • AppDomain 崩溃或被卸载(尽管您可以使用关键终结器(CriticalFinalizerObject、SafeHandle 或类似的东西)规避此问题
    • 不发生垃圾回收
    • 进程崩溃

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

    我想还有很多事情会导致终结器永远无法运行。底线是,除了陈先生的话之外,终结器是一个安全网,减少错误的影响,因为例如资源会在某个时候被释放,这比从不要好,如果你忘记明确说明的话。

    【讨论】:

    • 您能引用更多重要的部分吗?是的,也许提问者正期待着这个链接。 ;)
    • 实际上,由于很多人问他们如何依赖终结器行为,我想我确实引用了最重要的部分;)另一方面,其他框这篇文章也可能很有趣。
    • @OregonGhost:我的理解是否正确:如果 20 个终结者每个需要 1.95 秒,那就太棒了,所有的都将执行 - 需要 39 秒。如果一个需要 2.05 秒,则跳过所有其他的执行。这似乎相当破碎。相当粗鲁地中断一个耗时超过 2 秒的终结器,以允许其他终结器在 40 秒超时的剩余时间内运行,这将是一个很好的功能。但是两秒钟后破坏东西似乎是一种错误。
    • @supercat:我不知道它是否与您描述的完全一样,我刚刚阅读了我链接的文章,另一方面声称这种行为多年来可能已经改变。不要忘记你永远不应该依赖终结器,所以我认为这很好。您必须在某处进行剪辑。如果您认为 2.05 秒应该没问题,那么 2.10 是什么? 2.15? 3? 5?您真的不想在应用程序消失之前等待 40 秒,它只是一个三级安全网(在完全运行终结器之后,每个等待 2 秒)。应用程序不应需要 40 秒才能关闭。
    • @OregonGhost:我认为对终结器设置两秒的限制通常是一件好事,如果施加限制将允许其他终结器运行;也许可以随着时间的推移减少限制(例如。所以每个终结器在 40 秒限制之前获得 5% 的剩余时间)。至于不依赖终结器,当应用程序被终止时,还有什么其他机制会向对象发出信号以保存其状态?
    【解决方案2】:

    如果一个终结器抛出异常,其他终结器将不会执行。

    如果你在对象上调用SuppressFinalizer,你也可以抑制终结器。

    来自MSDN(Object.Finalize):

    在以下异常情况下,Finalize 方法可能不会运行完成或根本不会运行:

    • 另一个终结器无限期阻塞(进入无限循环,尝试获取它永远无法获取的锁,等等)。由于运行时会尝试运行终结器直至完成,因此如果终结器无限期阻塞,则可能不会调用其他终结器。
    • 进程在没有给运行时清理机会的情况下终止。在这种情况下,运行时的第一个进程终止通知是 DLL_PROCESS_DETACH 通知。

    【讨论】:

    猜你喜欢
    • 2020-12-04
    • 2018-08-22
    • 1970-01-01
    • 2017-05-29
    • 2011-02-18
    • 2011-03-14
    相关资源
    最近更新 更多