मैंने कुछ कोडों में बस ठोकर खाई है जो GC.KeepAlive()
विधि का उपयोग करती हैं और मैं यह समझने की कोशिश कर रहा हूं कि यह कैसे काम करता है। उदाहरण के लिए, इस कोड में:कचरा कलेक्टर KeepAlive विधि टाइमर के साथ कैसे काम करता है?
Timer timer = new System.Timers.Timer(5000);
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Enabled = true;
GC.KeepAlive(timer);
इस कोड में, मैं समझता हूँ कि एक टाइमर वस्तु बनाई गई है, जो एक धागा है कि हर 5 सेकंड चलाता spawns है। अगला, जीसी लाइन भाग गया है। तब विधि बाहर निकलती है, कचरा संग्रह चलाने पर टाइमर को नष्ट कर देता है।
KeepAlive केवल KeepAlive को कॉल से पहले जीवित रखता है, जो मुझे लगता है कि यह लगभग 0.0000001 सेकेंड है और इसे किसी भी तरह से स्थानीय संदर्भ नहीं होने के कारण वहां नष्ट नहीं किया जाएगा (जब तक कि यह इसे नष्ट नहीं कर रहा है क्योंकि कुछ भी नहीं टाइमर ऑब्जेक्ट के साथ होता है?)
किसी भी तरह से, जब तक 5000 अंतराल मारा जाता है, तब तक विधि पहले समाप्त हो जाएगी और टाइमर नष्ट हो जाने की संभावना है। तो उस लाइन का उद्देश्य क्या है?
मूल डेवलपर से पूछें? – dtb
जब तक आप प्रबंधित कोड से निपट रहे हैं (यानी पूरी तरह से .NET में), 'GC.KeepAlive' का उपयोग करने की कोई आवश्यकता नहीं है। यह सब टाइमर ऑब्जेक्ट का संदर्भ रखता है, इसलिए यह कचरा नहीं होगा। [दस्तावेज़] (http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx) का कहना है कि यह वास्तव में प्रबंधित कोड में आवंटित ऑब्जेक्ट्स के उपयोग के लिए है जिसका उपयोग अप्रबंधित कोड (जैसे एक Win32 एपीआई कॉल)। तो इस विशेष उदाहरण के लिए, यह व्यर्थ लगता है। – ThatBlairGuy
अफसोस की बात है कि मूल डेवलपर लंबे समय से चला गया है, और मुझे बनाए रखने के लिए एक परियोजना की यह सुंदरता छोड़ दी है :) – NibblyPig