धागा एकत्र नहीं किया जाएगा, क्योंकि प्रत्येक चलने, प्रतीक्षा करने या निलंबित थ्रेड का उपयोग जीसी द्वारा किया जाता है ताकि यह तय किया जा सके कि जीवित क्या है (प्रत्येक धागे के ढेर में सबकुछ का पता लगाएं, उन सभी वस्तुओं द्वारा संदर्भित सबकुछ का पता लगाएं, फिर सबकुछ उन लोगों द्वारा संदर्भित, और इसी तरह, और आपने सब कुछ पहचाना है जो कचरा नहीं हो सकता है)।
थ्रेड समाप्त हो सकता है, अगर यह पृष्ठभूमि धागा था, क्योंकि तब प्रक्रिया में सभी अन्य धागे खत्म होने पर यह सक्रिय रूप से बंद हो जाएगा। अन्यथा एकमात्र चीज जो इसे मरने का कारण बनती है वह प्रक्रिया सक्रिय रूप से बाहर निकलती है, एक अपवाद (ThreadAbortException
सहित) या यह while
लूप से बाहर तोड़ रहा है।
एक मामला है कि कुछ मायनों में तुलनीय है नहीं है, कि हो सकता है कि तुम क्या करने की सोच रहे हैं:
var timer = new System.Threading.Timer(someCallback, null, new TimeSpan(0, 0, 5), new TimeSpan(0, 0, 5));
int someResult = doingSomethingElse();
doSomethingElseThatTakesLongerThan5Seconds();
यह एक और कोड है कि कुछ करने के लिए निष्पादन की एक और धागा कारण बनता है। इस मामले में, टाइमर वास्तव में रन से पहले एकत्रित कचरा हो सकता है, रनों में से एक के दौरान, या कन्स्ट्रक्टर रिटर्न के बाद किसी भी समय काफी सुंदर हो सकता है।
यहां महत्वपूर्ण बात यह है कि टाइमर के लिए कोई व्यक्तिगत धागा नहीं है, और धागा टाइमर ऑब्जेक्ट के बारे में "पता" भी नहीं है। चूंकि ऑब्जेक्ट की अंतिम पहुंच तब से हुई है, यह संग्रह के लिए योग्य है। यह चल रहे व्यक्तिगत थ्रेड के मामले से अलग है (या प्रतीक्षा, इत्यादि)।
स्रोत
2012-01-25 23:34:10
_running धागे जड़ों के रूप में गिनती है? _ या _references (एक धागे के अंदर) जो वस्तुओं के संदर्भ में जड़ों के रूप में गिना जाता है .._? –
@ रॉय जड़ों - मूल रूप से, ढेर स्थानीय। ध्यान दें कि arg0 (उर्फ यह) आमतौर पर लक्षित उदाहरण को जीवित रखेगा –
तो क्या यह गलत/ठीक कहने के लिए है: _GC को चल रहे थ्रेड_ को एकत्र करने की अनुमति नहीं है? –