2009-02-25 7 views
41

मुझे यह त्रुटि मिलती है यदि मैं पृष्ठभूमि बटन को दो बार शुरू करने वाला बटन क्लिक करता हूं।यह पृष्ठभूमि वर्कर वर्तमान में व्यस्त है और कई कार्यों को एक साथ नहीं चला सकता

This BackgroundWorker is currently busy and cannot run multiple tasks concurrently 

मैं इससे कैसे बच सकता हूं?

उत्तर

84

सरल: पृष्ठभूमिवर्कर को दो बार शुरू न करें।

आप देख सकते हैं कि वह पहले से IsBusy संपत्ति का उपयोग करके चल रहा है, तो बस इस कोड को परिवर्तित:

worker.RunWorkerAsync(); 
इस के लिए

:

if(!worker.IsBusy) 
    worker.RunWorkerAsync(); 
else 
    MessageBox.Show("Can't run the worker twice!"); 

अद्यतन:

यदि आप करते हैं वास्तव में एक ही समय में कई पृष्ठभूमि कार्यों को लॉन्च करने की आवश्यकता है, आप बस कई पृष्ठभूमिवर्कर ऑब्जेक्ट्स बना सकते हैं

+0

कुछ डिग्री के लिए मैं सहमत हूं कि उत्तर पूरी तरह से उपयोगी नहीं है। यदि आपको दो पृष्ठभूमि प्रक्रियाओं को चलाने की आवश्यकता है, तो यह देखते हुए, "त्रुटि को दो बार नहीं चलाया जा सकता" के बजाय त्रुटि प्राप्त करना बहुत अच्छा नहीं है। मैं प्रत्येक कार्य के लिए नई पृष्ठभूमि वर्कर्स चलाने के बारे में जवाब मानूंगा - या किसी तरीके से नौकरियों को कतार में एक बेहतर समाधान है, जिससे आपको यह जांचना पड़ेगा कि सिस्टम के किसी अन्य भाग ने पहले से ही पृष्ठभूमि नौकरी शुरू कर दी है और कार्य उस पर चढ़ो। – Thies

51

प्रत्येक ऑपरेशन के लिए एक नया BackgroundWorker ऑब्जेक्ट बनाएं जो आप करना चाहते हैं। अर्थात, बजाय:

BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
for (int i; i < max; i++) { 
    worker.RunWorkerAsync(i); 
} 

इस प्रयास करें:

for (int i; i < max; i++) { 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
    worker.RunWorkerAsync(i); 
} 
+0

यह एक अच्छा जवाब है। यदि आवश्यक हो तो हम सभी पृष्ठभूमि वर्कर्स को कैसे मार सकते हैं? –

+0

@VladSpreys मैं वास्तव में केवल एक टिप्पणी में थ्रेड रद्दीकरण पर चर्चा नहीं कर सकता, लेकिन इस विषय पर इस साइट पर कुछ वाकई अच्छी पोस्ट हैं। –

+0

@ fatcat1111 धन्यवाद। अगर हम इसका संदर्भ रखते हैं तो मैं धागे को रद्द करने के विचार को समझता हूं। लेकिन इस कोड स्निपेट के साथ हम नहीं करते हैं। –

5

मैं कार्य किया जा करने की जरूरत है कि queue'ing पर गौर करेंगे। आपको निम्नलिखित फायदे मिलते हैं;

  • आप पृष्ठभूमि कार्य कुछ और की वजह से शुरू करने में सक्षम नहीं किया जा रहा की समस्याओं को संभालने के लिए पहले से चल रहा
  • आप भी कई धागे का उपयोग कर के बारे में चिंता करने के लिए बनाने के लिए एक नया पृष्ठभूमि काम किया द्वारा की जरूरत नहीं है की जरूरत नहीं है प्रत्येक कार्य के लिए।
  • आखिरकार कतार आपको यह सुनिश्चित करने की अनुमति देता है कि पृष्ठभूमि कार्य उसी क्रम में चलते हैं जहां उन्होंने बनाया/अनुरोध किया था।

यहां एक उदाहरण कार्यान्वयन है: http://thevalerios.net/matt/2008/05/a-queued-backgroundworker। मुझे यकीन नहीं है कि थ्रेडसेफ में कार्यान्वयन, और एक बार कार्यान्वयन में मेरी वर्तमान लॉकिंग समस्या से बाहर निकलने के बाद मैं अपना जवाब अपडेट कर दूंगा।

+0

मल्टीथ्रेडिंग की आवश्यकता होने पर यह एक शानदार तरीका है –

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