2012-01-11 108 views
6

我碰到一個面試問題,我不知道答案(有點幫助:))來到 以及它說的那種東西:終結卡在無限循環

Class SomeClass : IDisposable 
{ 
    public void Dispose() 
    { 
     while(true) 
     { 
     } 
    } 

    ~SomeClass() 
    { 
     Dispose(); 
    } 
} 

1)是否對象獲取敲定什麼時候在下一個GC之後不再引用?我的回答是否定的,因爲定稿線程會卡在無限循環中。

2)什麼能在處置完成,結束定稿多少次將環繼續對象被銷燬(帶出來走在考慮到它會在下一代花費的時間)

我不是特別清楚確切的問題(2)。我有點跑出來的時間...

不知道我把一個靜態計數器到達3和電話打破,並指出了答案3 這在技術上會工作:),但這不是答案

我猜這是與GC有關的事情.SupressFinalize()? 可能在進入循環之前調用GC.SupressFinalize()?

任何想法,如果不是對不清楚的問題的答案,更多的是他們可能瞄準什麼?

+3

通過任何手段,這是一個奇怪的面試問題檢查對象的配置狀態 - 而深入的知識關於GC是一個普遍適用的領域,我不知道這個特定問題的任何答案都會顯示面試官(除了你知道有一個線程執行完成調用) – BrokenGlass 2012-01-11 20:45:53

回答

8

發生什麼事情並不重要。 CLR將終止該程序,終結器上有2秒的超時時間。

+7

這是哪裏記錄? – Oded 2012-01-11 20:26:54

+2

@Oded - Richter的CLR通過C#,第478頁根據這篇博客文章:http://nitoprograms.blogspot.com/2009/08/finalizers-at-process-exit.html – 2012-01-11 20:36:07

+7

我不能repro這個終結器超時一個控制檯應用程序,似乎很高興地運行 - 上面的鏈接似乎只涉及終止程序運行在進程退出時間 – BrokenGlass 2012-01-11 20:38:33

0

您可以使用布爾變量,這將有助於Dispose方法從進入無限循環

class SomeClass : IDisposable 
{ 

    bool _disposed = false; 

    public void Dispose() 
    { 
     while (true && !_disposed) 
     { 
      _disposed = true; 
      Console.WriteLine("disposed"); 
     } 
    } 

    ~SomeClass() 
    { 
     Dispose(); 
    } 
}