2010-05-06 11 views
37

अगर मैं एक विधि में कोड की निम्न ब्लॉक (.NET 4 और कार्य समानांतर लाइब्रेरी का उपयोग):क्या .NET टास्क इंस्टेंस रन के दौरान दायरे से बाहर हो सकते हैं?

var task = new Task(() => DoSomethingLongRunning()); 
task.Start(); 

और विधि रिटर्न, उस कार्य क्षेत्र से बाहर जाने के लिए और कचरा एकत्र हो जाएगा, या क्या यह पूरा होने के लिए चलेगा? मैंने जीसीइंग के साथ किसी भी मुद्दे पर ध्यान नहीं दिया है, लेकिन यह सुनिश्चित करना चाहता हूं कि मैं जीसी के साथ दौड़ की स्थिति के लिए खुद को स्थापित नहीं कर रहा हूं।

+0

मुझे थोड़ी देर के बाद इस बारे में एक छोटी सी चीज़ मिली और मैंने सोचा कि मैं आपके साथ साझा करूँगा, पूर्णता के लिए ... नीचे दिए गए अपडेट को देखें। –

उत्तर

30

अद्यतन:

बाद मैं इस सवाल का जवाब (! एक लंबे समय पहले) मुझे पता चला है कि यह सच नहीं है कि कार्य हमेशा पूरा होने तक चलेगा - वहाँ एक छोटा सा, मान लें कि "कोने" मामला है, जहां कार्य खत्म नहीं हो सकते हैं।

इसका कारण यह है: जैसा कि मैंने पहले उत्तर दिया है, कार्य अनिवार्य रूप से धागे हैं; लेकिन वे पृष्ठभूमि धागे हैं। सभी अग्रभूमि धागे खत्म होने पर पृष्ठभूमि धागे स्वचालित रूप से निरस्त हो जाते हैं। इसलिए, यदि आप कार्य के साथ कुछ भी नहीं करते हैं और कार्यक्रम समाप्त होता है, तो एक मौका है कि कार्य पूरा नहीं होगा।

आपको हमेशा कार्यों पर इंतजार करना चाहिए। अधिक जानकारी excellent answer Jon gave me पर मिल सकती है।


मूल:

टास्क ThreadPool करने के लिए निर्धारित कर रहे हैं, जिसका अर्थ है कि वे अनिवार्य रूप से कर रहे हैं threads¹ (वास्तव में, वे धागे संपुटित)।

Thread documentation से:

यह एक थ्रेड ऑब्जेक्ट में एक संदर्भ बनाए रखने के लिए एक बार आप धागा शुरू कर दिया है आवश्यक नहीं है। थ्रेड थ्रेड प्रक्रिया पूर्ण होने तक निष्पादित करना जारी रखता है।

तो, नहीं, इसके संदर्भ को बनाए रखने की कोई आवश्यकता नहीं है।

इसके अलावा, documentation कहा गया है कि पसंदीदा तरीका एक टास्क बनाने के लिए इसका कारखाना उपयोग करने के लिए है:

तुम भी बना सकते हैं और एक आपरेशन में एक कार्य शुरू करने के लिए StartNew विधि उपयोग कर सकते हैं। यह पसंदीदा तरीका बना सकते हैं और कार्य शुरू करने के लिए करता है, तो निर्माण और शेड्यूलिंग अलग (...)

आशा है कि यह मदद करता है होना जरूरी नहीं है।


¹ तदनुसार को documentation:

एक टास्क एक अतुल्यकालिक आपरेशन का प्रतिनिधित्व करता है, और कुछ मायनों में यह एक नया धागा या ThreadPool काम आइटम के निर्माण के जैसा दिखता है, लेकिन एक पर अमूर्तता का उच्च स्तर।

11

कार्य पूरा होने के लिए चलाया जाएगा। भले ही इसमें कोई अन्य संदर्भ न हो (भले ही मुझे विश्वास न हो कि यह शब्द है), थ्रेड पूल अभी भी इसका संदर्भ रखेगा, और इसे कम से कम कचरा होने से रोक देगा (मैं कम से कम कहता हूं, क्योंकि यहां तक ​​कि पूरा होने के बाद, पूरा होने तक कोई गारंटी नहीं है कि यह कचरा एकत्रित किया जाएगा)।

+0

हां, 'रूट' सही शब्द है। जब तक * कुछ * कार्य उदाहरण के लिए एक मान्य (लाइव) संदर्भ है, तब तक यह संग्रह के लिए योग्य नहीं होगा। इस मामले में, थ्रेड पूल स्वयं उस संदर्भ को तब तक रखेगा जब तक कि धागा पूरा न हो जाए। –

+5

अधिक सटीक होने के लिए, टीपीएल के कार्य शेड्यूलर के कार्य के दौरान कार्य का संदर्भ होगा। उस संदर्भ के बिना, कार्य कचरा इकट्ठा हो सकता है, लेकिन यह कोड को समाप्त नहीं करेगा जो परिष्करण से चलता है। – Steven