एक वस्तु की काल्पनिक विधि पर विचार करें जो आपके लिए सामान करती है:
public class DoesStuff
{
BackgroundWorker _worker = new BackgroundWorker();
...
public void CancelDoingStuff()
{
_worker.CancelAsync();
//todo: Figure out a way to wait for BackgroundWorker to be cancelled.
}
}
बैकग्राउंडवॉकर के लिए कोई कैसे इंतजार कर सकता है?
अतीत में लोगों ने कोशिश की है:
while (_worker.IsBusy)
{
Sleep(100);
}
लेकिन यह गतिरोध , क्योंकि IsBusy
इस RunWorkerCompleted
घटना को संभालने के बाद तक मंजूरी नहीं दी जाती है, और जब तक आवेदन निष्क्रिय नहीं हो जाता है, तब तक उस घटना को नियंत्रित नहीं किया जा सकता है। जब तक कार्यकर्ता काम नहीं करेगा तब तक आवेदन बेकार नहीं जाएगा। (प्लस, यह एक व्यस्त लूप है - घृणित।)
अन्य लोगों ने इसमें शामिल होने का सुझाव दिया है:
while (_worker.IsBusy)
{
Application.DoEvents();
}
इसके साथ समस्या यह है कि Application.DoEvents()
वर्तमान में संसाधित किए जाने वाले कतार में संदेशों का कारण बनता है, जो पुन: प्रवेश की समस्याओं का कारण बनता है (.NET फिर से प्रवेश नहीं करता है)।
मुझे इवेंट सिंक्रनाइज़ेशन ऑब्जेक्ट्स से जुड़े कुछ समाधान का उपयोग करने की उम्मीद है, जहां कोड एक घटना की प्रतीक्षा करता है - जो कि कार्यकर्ता के RunWorkerCompleted
इवेंट हैंडलर सेट करता है। कुछ इस तरह:
Event _workerDoneEvent = new WaitHandle();
public void CancelDoingStuff()
{
_worker.CancelAsync();
_workerDoneEvent.WaitOne();
}
private void RunWorkerCompletedEventHandler(sender object, RunWorkerCompletedEventArgs e)
{
_workerDoneEvent.SetEvent();
}
लेकिन मैं गतिरोध पर वापस आ गया हूं: ईवेंट हैंडलर तब तक नहीं चल सकता है जब तक कि एप्लिकेशन निष्क्रिय नहीं हो जाता है, और एप्लिकेशन निष्क्रिय नहीं होगा क्योंकि यह एक ईवेंट का इंतजार कर रहा है।
तो आप एक BackgroundWorker के खत्म होने का इंतजार कैसे कर सकते हैं?
अपडेट करें लोग इस प्रश्न से भ्रमित होने लगते हैं। उन्हें लगता है कि मैं के रूप में BackgroundWorker का उपयोग किया जाएगा लगता है:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += MyWork;
worker.RunWorkerAsync();
WaitForWorkerToFinish(worker);
यह वह नहीं है, यह वह नहीं है जो मैं कर रहा हूं, और यह वह नहीं है जो यहां पूछा जा रहा है। अगर ऐसा होता तो बैकग्राउंड वर्कर का इस्तेमाल करने का कोई मतलब नहीं होता।