2008-08-16 12 views
6

समय-समय पर मुझे सिस्टम मिल जाता है। थ्रेडिंग। थ्रेडस्टेट अपवाद थ्रेड को पुनरारंभ करने का प्रयास करते समय। सवाल में कोड इस प्रकार है:थ्रेडस्टेट एक्सेप्शन एक थ्रेड को पुनरारंभ करने का प्रयास करते समय

// Make sure the thread is done stopping 
while (this.mThread.ThreadState == ThreadState.Running) 
{ 
    Thread.Sleep(0); 
} 
// Respawn a thread if the current one is stopped or doesn't exist 
if (this.mThread == null || this.mThread.ThreadState == ThreadState.Stopped) 
{ 
    this.mThread = new Thread(new ParameterizedThreadStart(Monitor)); } 
// Start the thread 
if (check) 
{ 
    this.mThread.Start(60000); 
} 
else 
{ 
    this.mThread.Start(0); 
} 

तो दो सवाल - इस काम करने का सही तरीका है, और यह है, वहाँ होने से त्रुटि से बचने के लिए एक रास्ता है?

उत्तर

3

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

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

व्यक्तिगत रूप से, मैं पूरे कोड को पुनर्गठित करने का प्रयास करूंगा ताकि मुझे एक और थ्रेड बनाने की आवश्यकता न हो, लेकिन थ्रेड ऑब्जेक्ट के अंदर कोड को लूप के अंदर लपेटें ताकि थ्रेड बस चल रहा हो।

1

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

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

दूसरी संभावना यह है कि धागा निरस्त कर दिया गया था। छोड़े गए थ्रेड निरस्त राज्य में जाते हैं, न कि स्थगित राज्य, और निश्चित रूप से पुनरारंभ करने के लिए भी मान्य नहीं हैं।

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

if (this.mThread == null || this.mThread.ThreadState != ThreadState.Suspended)

6

यह के लिए एक धागा एक से अधिक राज्य में एक ही बार में संभव हो सका, इसलिए ThreadState संपत्ति वास्तव में संभावित स्थितियों में से एक बिटमैप है। तो केवल एक राज्य के साथ समानता के लिए परीक्षण आपको सही परिणाम नहीं देगा। आपको कुछ ऐसा करने की आवश्यकता होगी:

if((mThread.ThreadState & ThreadState.Running) != 0) 

हालांकि, थ्रेड स्टेटस की जांच करना कुछ भी गलत है। मैं पूरी तरह से स्पष्ट नहीं हूं कि आप क्या हासिल करने की कोशिश कर रहे हैं लेकिन मुझे लगता है कि आप इसे पुनरारंभ करने से पहले थ्रेड को समाप्त करने की प्रतीक्षा कर रहे हैं। उस मामले में आपको क्या करना चाहिए:

mThread.Join(); 
mThread = new Thread(new ParameterizedThreadStart(Monitor)); 
if(check) 
    mThread.Start(60000); 
else 
    mThread.Start(0); 

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

जॉन।

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

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