2012-07-03 10 views
5

System.ComponentModel.BackgroundWorkerWPF uygulamasında kullanıyorum.BackgroundWorker için zaman aşımı

BackgroundWorker için zaman aşımı'u nasıl ayarlayabilirim?

+1

Ne yapmak için zaman aşımı? – Dimitri

+1

bir şey, bir şey yapar ve zaman aşımı sonrasında bunu durdurmak istiyorum. –

+0

BugFinder, yürütme iptalini iptal etmek için kullanım iptali belirtisi olarak evet – Dimitri

cevap

4

Benim önerim

backgroundworker1 takip ediyor çalışır - Bunu durdurmak yapabilirsiniz böylece iptal kabul eder. Zaman aşımı beklemede ve zaman aşımına uğradığında, bir döngü oluşturmaz.

backgroundworker2backgroundworker1 hala çalışıyor

, bu BackgroundWorker ait RunWorkerComplete, backgroundworker1 ..

Bu aynı zamanda yüzden backgroundworker1 tamamlamalar ve bu hala çalışıyorsa o iptali kabul etmelidir öldürmektedir , iptal edebilirsiniz.

+0

başka bir konu de facto, başka bir şekilde kolay değil mi? –

+0

Muhtemelen, ancak işlevselliği yanı sıra oldukça doğru bir zaman ayırmak için, birçok seçenek var. Soyundan bir şekilde yapabilir ve orijinal çalışanınızda geçen zamanı sürekli olarak kontrol edebilirsiniz, ancak herhangi bir engelleme çağrınız varsa zaman aşımını geçebilir. – BugFinder

4

BackgroundWorker bir zaman aşımını doğrudan desteklemez, ancak iptal işlemini desteklemektedir. Yapılan iş, iptal işlemini iptal etmek için İptal Edilen Üyeyi periyodik olarak kontrol edebileceğiniz bir döngü veya başka bir yapı ise, bu iyi çalışacaktır. Arka plan çalışanının zaman aşımından sonra iptal edilmesini söylemek için başka bir şeye ihtiyacınız olacaktır. Burada bir eylemin bir async çağrısı kullandım.

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 
      } 
     } 
    } 

bu gerçekten senin sen Implementing a timeout on a function returning a value veya Implement C# Generic Timeout bulunan jenerik zaman aşımı çözümleri ilginizi çekebilir başarmak için çalışıyoruz ne uymuyorsa. Bunları BackgroundWorker'da kullanabilirsin.

+0

Teşekkür ederim ama çalışmıyor, eventArgs.Cancel asla gerçekleşmez. –

+0

@ArmenKhachatryan Oh, Tabii ki değil, ben iptal bilgileri için yanlış nesneyi kontrol ediyordum (^ _ ^;). Düzeltme ile düzenledim. – vossad01

+0

Bir Çekicilik gibi çalışır. Çok teşekkürler .... Eğer OO moduna geçiyorsanız ;-), Your can Global var bg = yeni BackgroundWorker ve CancelAsync() kullanın; kodunuzun herhangi bir yerinde. –