2012-10-04 90 views
2

從MSDN文檔報價爲GC.WaitForPendingFinalizers()在.NET中,GC.WaitForPendingFinalizers()在哪些情況下阻塞?

上終結器運行的線程是不確定的,所以不能保證此方法將終止。

我真的不明白這句話。這種方法在哪種情況下不會終止?這與終結器運行的線程有什麼關係?他們爲什麼說這個線程是「未指定的」?

關於終結器線程,我認爲以下是正確的(?):

  • 這裏只有一個終結線程。
  • 終結器總是在單獨的線程上運行(即永遠不會在主線程或任何其他用戶創建的線程上運行)。

注:我能想象當終結塊之一,但這個問題存在,不管使用什麼樣的線程的終結這種方法將阻塞。

回答

2

another article on MSDN

finalize方法可能無法完成運行,或可能不會在 所有在下列特殊情況下運行:

  • 另一個終結塊無限期(進入一個無限循環, 試圖獲得它永遠不能獲得的鎖等等)。因爲 運行時試圖運行終結器完成,所以如果終結器無限期地阻塞,可能不會調用其他終結器 。

  • 該過程終止,但不給運行時機會清理 了。在這種情況下,運行時的進程 終止的第一個通知是DLL_PROCESS_DETACH通知。

+1

好的,但爲什麼該文檔明確指出「運行終結器的線程未指定」?僅僅寫「不能保證這種方法會終止(因爲阻塞終結器)」? –

+2

我認爲這是說CLR團隊希望將來有權更改實施細節,他們不希望您指望今天的工作方式。事實是,他們在自己的線程上運行(不是所謂的GC.Collect)。 –

+1

通過C#在Richter的CLR中,我相信他提到了(很像Shahar寫的),將來CLR可能會使用多個終結器線程。我沒有這本書,但我認爲可以在其中找到深入的討論,這可能會更好地回答你的問題。 –

1

首先,您通常不需要使用GC類中的方法,除了可能用於SuppressFinalize。大多數其他方法通常會使您的應用程序性能最差,而不是更好。

但是,爲了回答你的問題,據我所知,當收集執行時,終結器垃圾收集器持有的內部列表運行,,它們都在同一線程上按順序運行。這意味着,如果一個終結塊,那麼我猜這個方法也會阻塞。

當應用程序域關閉時,所有終結器都有時間限制完成,在這種情況下,我想這並不重要。

+0

請參閱Richard Morgan的回答評論。 –

相關問題