c# - BackgroundWorkers never stop being busy -
के लिए (यह कई गुना करते हैं) {while (backgroundWorker1.IsBusy & BackgroundWorker2.IsBusy & amp; ; और पृष्ठभूमिवर्कर 3। आईएसबीसी और amp; पृष्ठभूमि वर्कर 4। आईएसबीबी और पृष्ठभूमि वर्कर 5. आईएसबीसी) {सिस्टम। थ्रेडिंग। थ्रेड। नींद (0001); } If (! BackgroundWorker1.IsBusy) {backgroundWorker1.RunWorkerAsync (); } और अगर (! BackgroundWorker2.IsBusy) {backgroundWorker2.RunWorkerAsync (); } और अगर (! BackgroundWorker3.IsBusy) {backgroundWorker3.RunWorkerAsync (); } और अगर (! BackgroundWorker4.IsBusy) {backgroundWorker4.RunWorkerAsync (); } और अगर (! BackgroundWorker5.IsBusy) {backgroundWorker5.RunWorkerAsync (); }}
यह पांच गुना (प्रत्येक बीजी-कार्यकर्ता एक बार) चलाता है और उस समय में फंस जाता है। क्या पृष्ठभूमिवाले कभी व्यस्त नहीं रह जाते हैं? मैं उपलब्धता की जांच कैसे करूं?
ध्यान दें: इसमें 5 कार्यकर्ता धागे हैं, यह आश्वासन देता है कि उनमें से कोई भी कभी भी रोका नहीं गया है, हमेशा उन्हें काम बताता है। लेकिन वे मुझसे कहने से इनकार करते हैं कि जब वे उपलब्ध हैं, तो मैंने सोचा था कि इसका सरल समाधान होगा ..
- [संपादित करें अनुरोध] ---
असल में यह केवल एक डमी था पैरामीटर, मैंने इसे हटा दिया और इसे बाहर निकालने के लिए भूल गया, मैं केवल इसका उपयोग dowork को कॉल करने के लिए करता हूं, जो गंदे काम करता है:
निजी शून्य पृष्ठभूमि वर्कर 1_DoWork (ऑब्जेक्ट प्रेषक, DoWorkEventArgs ई) {timeconsumingfunction ( publicstring); }
और टाइमकंसमिंग फ़ंक्शन समाप्त होता है डीबगर में चलते हुए और प्रति पंक्ति लाइन चल रहे, यह अंत तक चला जाता है और अंतिम '}' में आ जाता है इसका मतलब है कि यह समाप्त होता है, ठीक है?
--- [संपादित करें] ---- यह सिर्फ लाइन की जगह जस्ट द्वारा काम किया गया
System.Threading.Thread.Sleep ( 0001);
के साथ
application.DoEvents ();
मुझे लगता है कि यह पृष्ठभूमि को चलाएगा, लेकिन जवाब नहीं मिला और IsBusy टैग को अपडेट न करें।
सभी को धन्यवाद, बहुत अच्छे उत्तर, बहुत मदद मिली!
आपका लूप गतिरोध पैदा कर रहा है, बीजीडब्ल्यू पूरी नहीं हो सकती। समस्या RunWorkerCompleted ईवेंट है, यह UI थ्रेड पर उठाया गया है। बीजीडब्ल्यू जादू के उस बिट को यूआई थ्रेड को बेकार होने की आवश्यकता है, इसे अपने संदेश पाइप को पंप करना होगा समस्या यह है कि UI थ्रेड बेकार नहीं है और यह संदेश पंप नहीं कर रहा है, यह लूप में फंस गया है। इस प्रकार, ईवेंट हैंडलर नहीं चल सकता है और IsBusy सही रहता है।
आपको इसे अलग तरह से करना होगा उस रन को चलाने के लिए RunWorkerCompleted ईवेंट का लाभ उठाएं, जो सामान्यतः लूप के लिए उसके बाद चलाया जाता है। एप्लिकेशन को कॉल करने के लिए सभी प्रलोभन का विरोध करें। डूएन्ट्स () लूप के अंदर।
Comments
Post a Comment