2009-06-28 14 views
9

मैं सी # में थ्रेड को निरस्त, रोक और फिर से कैसे शुरू करूं?मैं सी # में थ्रेड को निरस्त, रोक और फिर से कैसे शुरू करूं?

संबंधित प्रश्न:

Is there a way to indefinitely pause a thread?

+0

(मेरे उत्तर में मेरी टिप्पणी को अपडेट करें) –

उत्तर

23

सामान्य तौर पर, ठहराव नहीं कर (या गर्भपात) एक Thread - आप सामान्य रूप से नहीं बता सकता कि यह क्या कर रहा था, और यह सभी प्रकार का नेतृत्व कर सकेगी मुद्दों को लॉक करने के लिए, जैसे एक लॉक जो जारी नहीं किया गया है, या एक प्रकार प्रारंभकर्ता (स्थिर कन्स्ट्रक्टर) जो लटका हुआ है।

// worker loop 
while(alive) { 
    // if the gate is closed, wait up to 5 seconds; if still not 
    // open, go back to the loop-start to re-check "alive" 
    if (!gate.WaitOne(5000)) continue; 

    // do work... 
} 

फिर एक और उपयोग के साथ धागा: अपने पाश में एक ManualResetEvent का उपयोग कर कि बाहरी कोड (एक और धागा पर) खोल सकते हैं और करीब उदाहरण के लिए, -

हालांकि, आप कोड और अधिक सुरुचिपूर्ण तरीकों के माध्यम से रोकते हैं हो सकता है (शायद अप्रत्यक्ष) रोक सकता है (Reset) और फिर से शुरू करें (Set) कार्यकर्ता, लेकिन ज्ञान में यह केवल एक सुरक्षित स्थिति में रुक जाता है।


अपनी टिप्पणी (एक अन्य उत्तर पर) - ऐसा लगता है जैसे आपके पास एक पाठक और लेखक है; एक निर्माता/उपभोक्ता परिदृश्य के लिए आदर्श। अगर वहाँ उपभोक्ता ब्लॉक करता है, तो कोई डाटा नहीं है वहाँ, और निर्माता ब्लॉक बहुत ज्यादा - मैं एक एक उदाहरण है कि कैसे एक छाया हुआ आकार के साथ एक निर्माता/उपभोक्ता लिखने के लिए (इसलिए यह दलदल नहीं होगा उपभोक्ता चलाता धीमी गति से हो) की on this question है ।

+1

+1 जो बिल्कुल सही दृष्टिकोण है। –

+1

अरे, यह दूसरा +1 है जो मुझे आज अपने मंत्रों में से एक के लिए आपको देना था: धागे अपने जीवनकाल के लिए ज़िम्मेदार होना चाहिए, अन्यथा आप सभी प्रकार की समस्याओं जैसे डेडलॉक्स और खोए गए डेटा में आते हैं। इसके बाद, आज आपके लिए कोई सूप नहीं :-) – paxdiablo

+0

यह ठीक है, अब मुझे कैप्ड किया गया है ;- –

8

आप धागा निरस्त किया गया है, तो इसे फिर से चलाने के लिए सक्षम नहीं होगा। आप एक अलग धागे पर एक ही काम के लिए (उदाहरण के लिए एक ही ThreadStart प्रतिनिधि) चला सकते हैं, लेकिन है कि एक ही धागा फिर से नहीं चल रहा है।

मैं दृढ़ता से सलाह देता हूं कि जब तक आपका ऐप नीचे नहीं आ जाता तब तक धागे को कठोर न करें। इसके बजाए, इसके बजाय graceful thread termination प्रोटोकॉल का काम करें, ताकि आप एक ऐसा कार्य बता सकें जिसे आप रोकना चाहते हैं। एक धागा को "रुकने" के लिए भी जाता है - आप वास्तव में कुछ थ्रेड को निलंबित नहीं करना चाहते हैं, जबकि इसमें कुछ महत्वपूर्ण संसाधन हो रहा है।

शायद अगर आप हमें अपनी स्थिति के बारे में अधिक बता सकते हैं, हम और अधिक मदद कर सकता है। monitors (पृष्ठ के दूसरे भाग को देखें) या wait handles के साथ प्राप्त करने के लिए गहन रोकें/फिर से शुरू करें या कार्यक्षमता रद्द करना काफी आसान है।

+4

मैं इस प्रकार जॉन स्कीट और मार्क ग्रेवेल दोनों पर प्रतिबंध लगाने का प्रस्ताव करता हूं ... आपको पहले 30 मिनट के लिए जटिल प्रश्नों का उत्तर देने और हमेशा के लिए सरल प्रश्नों का उत्तर देने से मना किया जाता है: पी –

+0

मेरी एप्लीकेशंस आरएफआईडी रीडर से contnuiasly थ्रेड द्वारा पढ़ना और टैग के आईडी डेटा को लिखना डेटाबेस, उस टेज पर डेटा लिखने पर मैं उस थ्रेड को निरस्त करना या रोकना चाहता हूं और इसे फिर से शुरू करना चाहता हूं और विशिष्ट थ्रेड को कैसे रोकूं कृपया मुझे उस पहलू में मदद करें –

1

आप थोड़ी देर के लिए एक धागा रुकना चाहते हैं तो, यह Sleep कॉल करने के लिए मिलता है।

आप इसे की जरूरत है जब तक कुछ हालत सच हो जाता है को रोकने के लिए, एक शर्त वैरिएबल या प्रतीक्षा का उपयोग करें।

.NET उपयोग Monitor में स्थिति चर के लिए Wait और Pulse सहित विधियों; एक परिचय के लिए see here। (विंडोज विस्टा ने विन 32 एपीआई में देशी कंडीशन वैरिएबल सपोर्ट भी जोड़ा, लेकिन यह एक पूरी तरह से अलग कार्यान्वयन है, .NET के बाद से VET को सशर्त चर समर्थन मिला है)।

वेट्स के लिए: कि WaitHandle वर्ग के WaitAny या WaitAny विधि भार के की चींटी उपयोग विभिन्न Win32 तुल्यकालन वस्तु WaitHandle (घटनाओं, mutexes, waitable टाइमर और इसके आगे के उपवर्गों के रूप में नेट में उजागर प्रकारों में से एक पर प्रतीक्षा करने के लिए है)।

0

यदि आप इसे करना चाहते हैं, भले ही यह एक बुरा विचार है, तो सस्पेंड और रेज़्यूमे विधियों को देखें - एमएसडीएन के पास इस विषय पर more info है, जिसमें यह एक बुरा विचार क्यों है।

दोहराने के लिए - मैं दृढ़ता से आपको मार्क ग्रेवेल के समाधान के साथ जाने की सलाह देता हूं।

+0

प्रिय नौसिखिया, यहां एक बंदूक है और जब मैं इसमें हूं कुछ डमडम बुलेट, वास्तव में सावधान रहें कि इस सामान का उपयोग वास्तव में खतरनाक नहीं है: पी –

+0

अरे, मैं हेनलेन के "एक सशस्त्र समाज एक विनम्र समाज" मंत्र का एक बड़ा प्रशंसक हूं, इसलिए हाँ, अगर इन सभी चेतावनियों के बाद वह चाहता है निलंबित/फिर से शुरू करें ... कम से कम मैंने अपने प्रश्न का उत्तर दिया :) –

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