Dot-Net

.net 終結器是否總是執行?

  • August 11, 2010

終結器是否保證在某些時候(備用斷電等)在 .NET 中執行?我知道 GC 是如何工作的,並且它們何時執行是不確定的。

(搜尋沒有顯示好的答案,所以我添加了這個問題,希望與不太容易發現的實際答案合併。除此之外,我已經知道答案並將添加幾天后它以防萬一沒有人提到它。)

正如Raymond Chen 解釋的那樣,終結器實際上可能永遠不會被執行。這個問題是在他一年一度的 CLR 週期間被問到的,這有點有趣,就在他解釋它的兩天后 :)

對於懶惰的人,(或者更確切地說,一個)結論是:

一個正確編寫的程序不能假設終結器將永遠執行。

如果您想知道是否可以依賴終結器,這已經是您必須知道的一切:不要依賴終結器。

正如 Raymond Chen 在連結文章中所說:

終結器是一個安全網,而不是資源回收的主要手段。

如果您正在尋找如何釋放資源,請查看 Disposable 模式。


終結器可能不會執行,例如,如果:

  • 另一個終結器拋出異常。
  • 另一個終結器需要 2 秒以上。
  • 所有終結器加起來需要 40 多秒。
  • AppDomain 崩潰或被解除安裝(儘管您可以使用關鍵終結器(CriticalFinalizerObject、SafeHandle 或類似的東西)規避這個問題)
  • 沒有垃圾收集發生
  • 程序崩潰

(注意:時間值可能會隨著時間的推移而改變,但前段時間肯定是正確的。)

我想還有很多事情會導致終結器永遠不會執行。底線是,除了來自陳先生的引用之外,終結器是一個安全網,可以減少錯誤的影響,因為例如資源有時會被釋放,如果你忘記明確地這樣做,這總比沒有好。

引用自:https://stackoverflow.com/questions/3458177