हां, आपको पृष्ठभूमि कार्यकर्ता का निपटान करना चाहिए।
आपको ThreadPool.QueueUserWorkItem(...)
का उपयोग करना आसान हो सकता है जिसके बाद किसी भी सफाई की आवश्यकता नहीं होती है।
क्यों तुम हमेशा निपटान() बुलाना चाहिए पर अतिरिक्त विवरण:
हालांकि अगर आप BackgroundWorker वर्ग में देखने के लिए यह वास्तव में किसी भी धागा साफ यह निपटाने विधि है में ऐसा नहीं करता है, यह अभी भी महत्वपूर्ण है कॉल करने के लिए कक्षा को कचरा कलेक्टर पर प्रभाव के कारण निपटाना है।
अंतिमकर्ताओं के साथ कक्षाएं तुरंत जीसीड नहीं हैं। उन्हें रखा जाता है और फाइनलजर कतार में जोड़ा जाता है। फाइनलज़र थ्रेड तब चलता है, (जो मानक पैटर्न कॉल का निपटान करता है)। इसका मतलब है कि ऑब्जेक्ट जीसी पीढ़ी 1 में जीवित रहेगा। और जीन 1 संग्रह जीन 0 संग्रह से कहीं दुर्लभ हैं, इसलिए आप स्मृति में चारों ओर घूमते हैं।
यदि आप निपटान() को कॉल करते हैं, तो ऑब्जेक्ट को अंतिमकरण कतार में जोड़ा नहीं जाएगा, इसलिए कचरा इकट्ठा करने के लिए स्वतंत्र है।
यह वास्तव में बड़ी समस्या नहीं है, लेकिन यदि आप उनमें से बहुत से निर्माण कर रहे हैं तो आप आवश्यकतानुसार अधिक मेमोरी का उपयोग कर समाप्त कर देंगे। इसे वास्तव में उन वस्तुओं पर निपटान करने के लिए अच्छा अभ्यास माना जाना चाहिए जिनके पास एक निपटान विधि है।
तो मुझे लगता है कि, बिलकुल भी, यह 100% कठिन और तेज़ आवश्यकता नहीं है। यदि आप निपटान() को कॉल नहीं करते हैं, तो आपका ऐप विस्फोट (या यहां तक कि स्मृति को भी रिसाव नहीं करेगा), लेकिन कुछ परिस्थितियों में इसका नकारात्मक प्रभाव हो सकता है। पृष्ठभूमि कार्यकर्ता को WinForms घटक के रूप में उपयोग के लिए डिज़ाइन किया गया था, इसलिए इस तरह इसका उपयोग करें, यदि आपके पास अलग-अलग आवश्यकताएं हैं और WinForms घटक के रूप में इसका उपयोग नहीं करना चाहते हैं, तो इसका उपयोग न करें, नौकरी के लिए सही टूल का उपयोग करें, थ्रेडपूल की तरह।
स्रोत
2009-11-18 12:25:47
_Why_ क्या उसे बीजीडब्ल्यू कॉल करना चाहिए। डिसस्पेक्ट()? सामान्य के अलावा 'क्योंकि यह वहां है' तर्क। –
@ हेंक। मैंने कुछ अतिरिक्त विवरण जोड़ा है। यह 100% महत्वपूर्ण नहीं है, लेकिन इसे कॉल करने के लिए डिज़ाइन किया गया था। यदि आप इसे कॉल नहीं करना चाहते हैं तो अन्य कक्षाएं हैं जो गैर-विनफॉर्म कोड के लिए बेहतर फिट हैं। –