2015-05-18 10 views
15

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

public class Test 
{ 
    static void Main() 
    { 
     Counter foo = new Counter(); 
     ThreadStart job = new ThreadStart(foo.Count); 
     Thread thread = new Thread(job); 
     thread.Start(); 
     Console.WriteLine("Main terminated"); 
    } 
} 

public class Counter 
{ 
    public void Count() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      Console.WriteLine("Other thread: {0}", i); 
      Thread.Sleep(500); 
     } 
     Console.WriteLine("Counter terminated"); 
    } 
} 

मुख्य दिनचर्या काउंटर थ्रेड शुरू करती है और मुख्य दिनचर्या समाप्त होती है। काउंटर थ्रेड निम्नलिखित आउटपुट देने पर ध्यान दिए बिना चलता है।

Main terminated  
Other thread: 0 
Other thread: 1 
Other thread: 2 
Other thread: 3 
Other thread: 4 
Other thread: 5 
Other thread: 6 
Other thread: 7  
Other thread: 8  
Other thread: 9 
Counter terminated 

मेरा उदाहरण प्रोग्राम दर्शाता है कि हालांकि कॉलिंग क्लास अब मौजूद नहीं है, धागा पूरा होने तक जीवित रहता है। हालांकि, मेरी समझ यह है कि एक बार कक्षा एक गुंजाइश से बाहर हो जाने के बाद, इसके संसाधन अंततः कचरे के संग्रह से जुड़े रहेंगे।

मेरे वास्तविक जीवन परिदृश्य में, थ्रेड एक विशाल ईमेलिंग 1-2 घंटे तक चल रहा है। मेरा सवाल है "क्या कचरा संग्रह अंततः धागे को मार देगा या जीसी को पता चलेगा कि धागा अभी भी प्रसंस्करण कर रहा है"? क्या मेरा ईमेलिंग थ्रेड हमेशा पूरा होने के लिए चलाएगा या क्या कोई खतरा है जो असामान्य रूप से समाप्त हो जाएगा?

+0

* हालांकि, मेरी समझ यह है कि एक बार कक्षा एक गुंजाइश से बाहर हो जाने के बाद, इसके संसाधन अंततः कचरे के संग्रह से जुड़े रहेंगे। * थ्रेड एक विशेष मामला है ... वे 'थ्रेड' ऑब्जेक्ट्स को "अंदर" रखते हैं, 'थ्रेड.कुरेंट थ्रेड', ** और ** में उनकी वर्तमान चलती विधि को जीसी रूट माना जाता है (इसलिए जीसी के लिए एक प्रारंभिक बिंदु यह पता लगाने के लिए कि क्या किसी ऑब्जेक्ट में अभी भी संदर्भ हैं) ... लेकिन हाँ, यह एक है परिपत्र तर्क। – xanatos

+2

कक्षाएं दायरे से बाहर नहीं जाती हैं। वस्तुएं दायरे से बाहर नहीं जाती हैं। वेरिएबल्स गुंजाइश से बाहर निकलते हैं (जो समझने में आसान है - इसका मतलब यह है कि वेरिएबल अब मौजूद नहीं है। यदि चर एक संदर्भ है, तो यह उस ऑब्जेक्ट को कुछ भी नहीं करता है जो इसे संदर्भित करता है)। – immibis

उत्तर

12

से System.Threading.Thread

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

तो Thread ऑब्जेक्ट को संदर्भित नहीं किया गया है, तो थ्रेड अभी भी चल जाएगा।

9

एक धागा एक पृष्ठभूमि धागा नहीं है, तो के लिए System.Threading.Thread.IsBackground

प्रलेखन पर एक नज़र डालें, तो यह नीचे बंद जब तक यह किया है से आवेदन रखेंगे।

+0

आईबैकग्राउंड इसे समझाता है।जब मैं इसे सत्य पर सेट करता हूं, तो कार्यक्रम तुरंत समाप्त हो जाता है जैसा कि मैं उम्मीद कर रहा था। मुझे सही जगह पर इंगित करने के लिए धन्यवाद। – MortimerCat

+1

@MortimerCat कचरा संग्रह के साथ इसका कोई लेना-देना नहीं है। यह एक * पूरी तरह से * अलग व्यवहार है। ऑब्जेक्ट कि थ्रेड के प्रवेश बिंदु पर चल रहा है, एकत्र नहीं किया जा रहा है, बल्कि पूरी प्रक्रिया को तोड़ दिया जा रहा है क्योंकि कोई सक्रिय धागे नहीं हैं। इसका दायरा, या जीसी, या किसी भी वस्तु से कोई लेना देना नहीं है; यह सब मायने रखता है कि क्या कोई अग्रभूमि धागा चल रहा है या नहीं। – Servy

+0

हाँ, @ सर्वी ने कचरा संग्रह के बारे में आपके प्रश्नों के बारे में बेहतर स्पष्टीकरण प्रदान किया है; यह उत्तर "इस अप्रत्याशित व्यवहार को कैसे बदल सकता है?" के बारे में अधिक है – adv12

8

हालांकि, मेरी समझ यह है कि एक बार कक्षा एक गुंजाइश से बाहर हो जाने के बाद, इसके संसाधन अंततः कचरे के संग्रह से जुड़े रहेंगे।

यह अधिक सटीक कहा जा सकता है:

एक बार जब ऑब्जेक्ट उदाहरण एक प्रबंधित संदर्भ के माध्यम से किसी भी निष्पादन योग्य कोड से अब पहुंच है, यह कचरा संग्रहण के लिए पात्र हो जाता है।

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

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

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