2012-07-03 8 views
5

के लिए टाइमआउट मैं System.ComponentModel.BackgroundWorker का उपयोग कर रहा हूं WPF एप्लिकेशन में।पृष्ठभूमिवर्कर

BackgroundWorker के लिए मैं टाइमआउट कैसे सेट कर सकता हूं?

+1

क्या करने के लिए टाइमआउट? – Dimitri

+1

कुछ, यह कुछ करता है, और मैं टाइमआउट के बाद इसे रोकना चाहता हूं। –

+0

हाँ जैसे बगफिंडर ने निष्पादन रद्द करने के लिए रद्दीकरण टोकन का उपयोग – Dimitri

उत्तर

4

मेरे सुझाव

backgroundworker1 पीछा कर रहा है काम करता है - यह रद्द करने को स्वीकार करता है, तो आप इसे रोकने के कर सकते हैं।

backgroundworker2 समय समाप्त होने के दौरान एक लूप करता है, और समय समाप्त हो जाता है।

तो backgroundworker1 अभी भी चल रहा है, इस BackgroundWorker की RunWorkerComplete, बंद को मारता है backgroundworker1 ..

यह भी रद्द ताकि अगर backgroundworker1 पूरा करता है और यह अभी भी चल रहा है स्वीकार करना चाहिए , आप इसे रद्द कर सकते हैं।

+0

एक और धागा डी वास्तव में, कोई आसान नहीं है, एक और तरीका है? –

+0

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

4

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

static void Main(string[] args) 
    { 
     var bg = new BackgroundWorker { WorkerSupportsCancellation = true }; 
     bg.DoWork += LongRunningTask; 

     const int Timeout = 500; 
     Action a =() => 
      { 
       Thread.Sleep(Timeout); 
       bg.CancelAsync(); 
      }; 
     a.BeginInvoke(delegate { }, null); 

     bg.RunWorkerAsync(); 

     Console.ReadKey(); 
    } 

    private static void LongRunningTask(object sender, DoWorkEventArgs eventArgs) 
    { 
     var worker = (BackgroundWorker)sender; 
     foreach (var i in Enumerable.Range(0, 5000)) 
     { 
      if (worker.CancellationPending) 
      { 
       return; 
      } 
      else 
      { 
       //Keep working 
      } 
     } 
    } 

यदि यह वास्तव में फिट नहीं करता है अपने क्या हासिल करना आप सामान्य समय समाप्ति समाधान Implementing a timeout on a function returning a value या Implement C# Generic Timeout में पाया में रुचि हो सकती कोशिश कर रहे हैं। आप BackgroundWorker के अंदर उन लोगों का उपयोग कर सकते हैं।

+0

धन्यवाद लेकिन यह काम नहीं करता है, eventArgs.Cancel कभी सच नहीं आता है। –

+0

@ अरमेनखचट्रीन ओह, निश्चित रूप से यह नहीं है, मैं रद्द जानकारी (^ _ ^;) के लिए गलत वस्तु की जांच कर रहा था। मैंने एक फिक्स के साथ संपादित किया है। – vossad01

+0

एक आकर्षण की तरह काम करता है। बहुत धन्यवाद .... यदि आप ओओ मोड जा रहे हैं ;-), आप ग्लोबल var bg = new BackgroundWorker कर सकते हैं और CancelAsync() का उपयोग कर सकते हैं; आपके कोड में कहीं भी। –

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