2012-10-30 10 views
5

पुष्टि के लिए मैं एक BackgroundWorker धागा जीवित है एक तरह से यह पता लगाने की कोशिश कर रहा हूँ (यानी अभी भी चल रहा धागा अनिवार्य रूप से एक सरल अनंत लूप के रूप में कार्यान्वित किया जाता है:।क्या पृष्ठभूमि वर्कर्स IsBusy "IsAlive" के समान है?

while (AllConditionsMet()) 
{ 
    DoSomeMagic(); 
    Thread.Sleep(10000); 
} 

IsAlive() के निकटतम बात मैं अब तक पाया IsBusy संपत्ति है, लेकिन दिया जाता है मेरी धागा नींद() कि समय के सबसे अधिक, मुझे यकीन है कि यह काम करेगा कि क्या नहीं कर रहा हूँ

मैं IsBusy पर भरोसा कर सकते हैं करने के लिए:।

if (!myWorker.IsBusy) 
    RestartWorker(); 

या मैं परेशानी के लिए बुला रहा हूँ?

+1

यदि isBusy गलत है तो पृष्ठभूमि कार्यकर्ता नौकरी नहीं कर रहा है, इसलिए आपको दिखाए गए कोड का उपयोग करके परेशानी नहीं हो रही है। केवल "RestartWorker()" विधि गलत है, क्योंकि कार्यकर्ता प्रारंभ नहीं हुआ है। लेकिन प्रोग्रामिंग मुद्दे की तुलना में यह एक भाषा की बात है। – jAC

+2

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

उत्तर

12

BackgroundWorker.IsBusy रूप में लंबे समय DoWork ईवेंट हैंडलर व्यस्त है के रूप में और RunWorkerCompleted ईवेंट हैंडलर अभी तक चलाने नहीं किया गया है सच है। बाद के खंड पर ध्यान दें, संपत्ति आपको बताती है कि आपका लूप सक्रिय है या नहीं।

इसके अलावा, आपके दूसरे स्निपेट में काफी खराब दौड़ की स्थिति है। if() कथन में IsBusy सच हो सकता है लेकिन बाद में एक नैनोसेकंड झूठा हो। एक महीने में एक बार दौड़ने वाली दौड़। कोड का इरादा स्निपेट्स से एक कठिन काम करने के लिए कठिन है। हमेशा एक नई बीजीडब्लू ऑब्जेक्ट बनाने पर विचार करें, जो कभी भी दौड़ नहीं पाएगा। उस लूप से छुटकारा पाने में भी मदद करता है, 10 सेकंड के लिए सोते धागे कुछ भी करने पर एक बहुत महंगा सिस्टम संसाधन बर्बाद कर रहा है। और यह थ्रेडपूल शेड्यूलर को गम-अप करता है।

4

docs से:

सच, BackgroundWorker एक अतुल्यकालिक आपरेशन चल रहा है तो; अन्यथा, झूठी

बावजूद यदि आप कार्यकर्ता धागा सोने या नहीं, यह अभी भी कुछ तो IsBusy का उपयोग कर ठीक किया जाना चाहिए क्या कर रही है।

5

यह सुनिश्चित करने के लिए कि बैकग्राउंडर वास्तव में बंद हो गया है, आप इसे मैन्युअल रूप से मार सकते हैं। yourBackgroundWorker.WorkerSupportsCancellation = true; सेट करें। तब बस अपने साथ BackgroundWorker रोक:

yourBackgroundWorker.CancelAsync(); 

फिर भी isBusy अपने BackgroundWorker की चल रही/काम कर रहे उदाहरण का पता लगाने के लिए पर्याप्त होना चाहिए।

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