2008-08-25 13 views
16

के साथ बनाए गए धागे को कैसे रोकें QueueUserWorkItem के साथ बनाए गए धागे को रोकने का कोई तरीका है?ThreadPool.QueueUserWorkItem

या शायद मुझे इसकी आवश्यकता नहीं है? क्या होता है यदि मुख्य आवेदन निकलता है? क्या इससे निर्मित सभी थ्रेड स्वचालित रूप से निरस्त हो जाते हैं?

उत्तर

14

आपको उन्हें निरस्त करने की आवश्यकता नहीं है। जब आपका एप्लिकेशन निकलता है, तो .NET IsBackground = true के साथ किसी भी थ्रेड को मार देगा। .NET थ्रेडपूल में इसके सभी थ्रेड IsBackground = true पर सेट हैं, इसलिए आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।

अब यदि आप थ्रेड क्लास को नए करके थ्रेड बना रहे हैं, तो आपको या तो उन्हें निरस्त करने या अपनी आईस्कैकग्राउंड संपत्ति को सत्य पर सेट करने की आवश्यकता होगी।

2

हां, वे करेंगे। हालांकि, अगर आप उन धागे में अप्रबंधित संसाधनों का उपयोग कर रहे हैं, तो आप बहुत सारी परेशानी का सामना कर सकते हैं।

3

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

यदि आप स्वयं को धागा छोड़ना चाहते हैं, तो आपको या तो धागे को प्रबंधित करना होगा (ताकि आप थ्रेड ऑब्जेक्ट पर थ्रेड.एबॉर्ट() को कॉल कर सकें) या आपको अधिसूचना तंत्र का कुछ रूप स्थापित करना होगा जो आपको धागे को बताने देगा कि इसे खुद को निरस्त करना चाहिए।

10

हालांकि, अगर आप उन धागे में अप्रबंधित संसाधनों का उपयोग कर रहे हैं, तो आप ऊपर मुसीबत का एक बहुत में खत्म हो सकता है।

यही नहीं बल्कि निर्भर करेगा आप उन्हें कैसे उपयोग कर रहे थे - अगर इन अप्रबंधित संसाधनों का ठीक से तो लिपटे रहे थे वे धागे जो उन्हें संदर्भित किया था को मारने के लिए इस्तेमाल किया तंत्र की परवाह किए बिना अपने आवरण को अंतिम रूप देने से निपटा जा चाहते हैं। और जब कोई ऐप किसी भी तरह से बाहर निकलता है तो ओएस द्वारा अप्रबंधित संसाधन मुक्त हो जाते हैं।

एक सामान्य भावना है कि (विंडोज़) एप्लिकेशन ऐप शटडाउन पर साफ-सफाई करने की कोशिश करने में बहुत अधिक समय बिताते हैं - प्रायः बड़ी मात्रा में मेमोरी में पेजिंग शामिल होते हैं ताकि इसे फिर से हटाया जा सके (या पेजिंग- कोड में जो असंगत वस्तुओं को मुक्त करने के आसपास चलता है जो ओएस किसी भी तरह से निपटता है)।

0

हाँ, वे पृष्ठभूमि हैं, लेकिन f.ex यदि आपके पास एप्लिकेशन है जहां आप किसी प्रकार के एकाधिक डाउनलोड या सामान के लिए थ्रेडपूल का उपयोग करते हैं, और आप उन्हें रोकना चाहते हैं, तो आप कैसे रुक सकते हैं? मेरे सुझाव होगा: बाहर निकलने धागा asap,

bool stop = false; 
void doDownloadWork(object s) 
{ 
    if (!stop) 
    { 
     DownloadLink((String)s, location); 
    } 
} 

f.ex और यदि आप बंद = सच है, दूसरे सेट (क़तार में) धागे स्वचालित रूप से बाहर निकलने के लिए कतार धागे यह प्रक्रिया खत्म होने के बाद।

+0

(नोएट गेंचर का जवाब) –

0

लुकास स्कालौस्कस के उत्तर के अनुसार।

लेकिन आप का उपयोग करना चाहिए:

volatile bool stop = false; 

संकलक इस चर कई धागे द्वारा किया जाता है बताने के लिए।

+0

अस्थिर कीवर्ड एकाधिक धागे द्वारा उपयोग किए जाने वाले चर के मुकाबले अधिक विशिष्ट उद्देश्यों के लिए है। इसका उपयोग करने के लिए अच्छे समय हैं और बुरे समय, हालांकि इस परिदृश्य में उपयोग उचित प्रतीत होता है, मैं नहीं चाहता था कि कोई भी सोचने के साथ आ रहा है कि उन्हें सभी बहु-थ्रेड एक्सेस किए गए चर के लिए ऐसा करना चाहिए।ऐसा लगता है कि आपको लेनदेन का कभी भी उपयोग नहीं करना चाहिए और हमेशा एसक्यूएल में नोलॉक संकेत निर्दिष्ट करना चाहिए जब वह कथन हाथ पर समाधान पर निर्भर करता है। – TheXenocide

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