2009-05-14 6 views
5

.Net में, मान लीजिए कि मैं एक ऑब्जेक्ट को तुरंत चालू करता हूं जो एसिंक्रोनस प्रक्रिया शुरू करता है (Delegate.BeginInvoke का उपयोग करके उसकी विधियों में से एक पर), फिर ऑब्जेक्ट को इसके संदर्भ को शून्य या इसे दायरे से बाहर जाने की अनुमति देकर छोड़ दें। क्या कचरा कलेक्टर ऑब्जेक्ट इकट्ठा करने का प्रयास करेगा जबकि एसिंक्रोनस प्रक्रिया प्रगति पर है? यदि नहीं, तो वस्तु को इकट्ठा करने से क्या रोक रहा है?क्या एनईटी जीसी गड़बड़ी एक अव्यवस्थित वस्तु के साथ असीमित तरीके से निष्पादित करेगा?

उत्तर

12

यदि आप पूरी तरह से प्रबंधित कोड में हैं, तो यह एकत्र नहीं होगा।

जो प्रतिनिधि आप फायरिंग कर रहे हैं वह वस्तु (आपके विवरण से) का हिस्सा है। जब तक यह चल रहा है, वस्तु के लिए एक सक्रिय संदर्भ है। जैसे ही प्रतिनिधि पूरा हो जाता है, वस्तु संग्रह के लिए उम्मीदवार बन जाएगी।

हालांकि, यदि आप प्रतिनिधि में मूल कोड में कॉल कर रहे हैं, तो ऐसी कुछ स्थितियां हैं जहां मूल कोड को पूरा करने से पहले ऑब्जेक्ट को अंतिम रूप दिया जा सकता है। विवरण के लिए, यह MSDN forum thread देखें।

+0

ग्रेट, कुल समझ में आता है। हालांकि मुझे इस पर थोड़ा विस्तार करने की जरूरत है। मैंने BeginInvoke में एक AsyncCallback पास कर दिया है ताकि मैं कुछ अंतिमकरण प्रसंस्करण कर सकूं और एंड्रॉन्क प्रक्रिया को पूरा होने पर EndInvoke को कॉल कर सकूं। क्या यह सच है कि इस AsyncCallback पूरा होने के बाद प्रतिनिधि कॉल पूरा नहीं हुआ है? और इस प्रकार ऑब्जेनकॉलबैक समाप्त होने के बाद तक ऑब्जेक्ट संग्रह के लिए उम्मीदवार नहीं बन जाएगा? –

+0

हां। Http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.asyncresult_members.aspx देखें - आपके प्रतिनिधि के लिए एक हैंडल है, और इसलिए आपकी ऑब्जेक्ट, AsyncDelegate प्रॉपर्टी में है। जब तक आपका कॉलबैक समाप्त नहीं होता है, यह जीसी के लिए उम्मीदवार नहीं होगा। –

+0

बिल्कुल सही, बहुत सराहना की। –

संबंधित मुद्दे