2012-01-11 18 views
6

मैं एक साक्षात्कार सवाल जो मैं जवाब (थोड़ी मदद :)) नहीं पता था भर में आया था में फंस अच्छी तरह से यह एक तरह से कुछ ने कहा:finalizer अनंत लूप

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

    ~SomeClass() 
    { 
     Dispose(); 
    } 
} 

1) वस्तु को अंतिम रूप दिया हो करता है अगली जीसी के बाद अब संदर्भित नहीं किया जाएगा? मेरा जवाब नहीं था, क्योंकि अंतिमकरण थ्रेड अनंत लूप पर फंस जाएगा।

2) क्या अंतिम रूप दिए जाने को समाप्त करने के निपटान में किया जा सकता है और इससे पहले कि वस्तु बाहर में लेने के समय यह अगले जनरल में खर्च करेगा)

खाते में साथ (निपटान किया जाता है पाश कितनी बार जारी रहेगा

मैं विशेष रूप से सटीक प्रश्न (2) से स्पष्ट नहीं हूं। 0 थोड़े समय से बाहर चला गया ...

उत्तर को नहीं जानते मैंने एक स्थिर काउंटर लगाया जो 3 तक पहुंच गया और ब्रेक कॉल किया और कहा 3 जो तकनीकी रूप से होगा काम :), लेकिन यह जवाब नहीं है

मैं इसे जीसी के साथ कुछ करने के लिए अनुमान लगा रहा हूं .SupressFinalize()? लूप में प्रवेश करने से पहले शायद GC.SupressFinalize() को कॉल कर रहा है?

अस्पष्ट प्रश्न के उत्तर पर नहीं, तो क्या कोई विचार है, जितना संभव हो सकता है कि वे क्या कर रहे हैं?

+3

में जाने किसी भी तरह से से निपटाने विधि में मदद मिलेगी एक बूलियन चर का उपयोग कर इस एक जिज्ञासु साक्षात्कार सवाल यह है कि वस्तु के निपटाए राज्य के लिए जाँच कर सकते हैं - गहराई से जानकारी में है, जबकि जीसी एक वैध क्षेत्र सामान्य रूप में में प्रहार करने के लिए है के बारे में, मैं नहीं जानता कि क्या इस विशेष प्रश्न के लिए किसी भी सवाल का जवाब (वास्तव अलावा आप जानते हैं कि किसी एकल थ्रेड कि अंतिम रूप देने के कॉल करता है) साक्षात्कारकर्ता दिखाएगा – BrokenGlass

उत्तर

8

यह असंभव है कि क्या होता है। सीएलआर कार्यक्रम को समाप्त कर देगा, फाइनेंजर पर 2 सेकंड का टाइमआउट होगा।

+7

कहाँ यह है दस्तावेज? – Oded

+2

@Oded - इस ब्लॉग पोस्ट के अनुसार सी #, पेज 478 के माध्यम से रिक्टर की CLR: http://nitoprograms.blogspot.com/2009/08/finalizers-at-process-exit.html –

+7

मैं इस finalizer टाइमआउट repro नहीं कर सकते एक सांत्वना अनुप्रयोग, खुशी से चलाने के लिए लगता है - केवल ऊपर के लिंक finalizers प्रक्रिया से बाहर निकलने के समय पर चलाने – BrokenGlass

0

आप जो अनंत लूप

class SomeClass : IDisposable 
{ 

    bool _disposed = false; 

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

    ~SomeClass() 
    { 
     Dispose(); 
    } 
}