2009-02-25 7 views

cevap

84

Basit: backgroundworker iki kez başlamayın.

zaten IsBusy özelliğini kullanarak çalışıyorsa bu yüzden sadece bu kodu değiştirmek, kontrol edebilirsiniz: Buna

worker.RunWorkerAsync(); 

:

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

Güncelleme: Bunu yaparsanız

Aslında birden fazla arka plan görevini aynı anda başlatmanız gerekiyor, sadece birden fazla BackgroundWorker nesnesi oluşturabilirsiniz

+0

Bir dereceye kadar cevabın tam olarak faydalı olmadığını kabul ediyorum. Bu durumda, iki arka plan işlemini çalıştırmanız için * yapmanız gereken * bir hata almak yerine, "İşçiyi iki kez çalıştırılamıyor" şeklinde bir hata bulmak harika olmaz. Her bir görev için yeni arka plan işlerini yürütmenin cevabını üstleneceğim - ya da bir şekilde işlerin sıraya konması daha iyi bir çözümdür, bu da sistemin başka bir bölümünün arka plan işini başlatıp başlatmadığını kontrol etmenize neden olmayacaktır. uppon. – Thies

51

Gerçekleştirmek istediğiniz her işlem için yeni bir BackgroundWorker nesnesi oluşturun. Yani yerine:

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

bu deneyin: Ben yapılması gereken görevleri queue'ing içine olmazdı

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

Bu harika bir cevap. Gerekirse arka plandaki tüm çalışanları nasıl öldüreceğiz? –

+0

@VladSpreys Sadece ipucu iptali konusunu sadece bir yorumda tartışamam ama konuyla ilgili bu sitede gerçekten iyi mesajlar var. –

+0

@ fatcat1111 Teşekkürler. Bir referans tutarsak ipucunu iptal etme fikrini anlıyorum. Ancak bu kod snippet'i ile yapmıyoruz. –

5

. Aşağıdaki avantajları elde edersiniz;

  • Zaten
  • Sen yeni bir arka plan çalışmış oluşturarak, çok fazla iş parçacığı kadar kullanmak konusunda endişe gerekmez çalışan dolayı başka bir şeye başlamak mümkün olmayan arka plan görevlerini sorunlarını ele almak gerekmez her görev için. Eğer yarattıkları nerede olarak arka plan görevleri aynı sırada çalışmasını sağlamak için izin verebilir
  • Son olarak kuyruk/istedi. İşte

uygulanmasının örneği sunulmuştur: http://thevalerios.net/matt/2008/05/a-queued-backgroundworker. Ben threadafe içinde uygulama olup olmadığından emin değilim ve ben çalıştığım bir uygulamada mevcut kilitleme sorunumdan anladım cevapımı güncelleyecektir.

+0

Bu, çoklu okuma gerektiğinde harika bir yaklaşım –