2009-02-25 4 views

Antwort

84

Einfach: Starten Sie den BackgroundWorker nicht zweimal.

Sie überprüfen können, ob es bereits unter Verwendung der IsBusy Eigenschaft ausgeführt wird, so dass nur diesen Code ändern:

worker.RunWorkerAsync(); 

dazu:

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

Update:

Wenn Sie das tun Wenn Sie mehrere Hintergrundaufgaben gleichzeitig starten müssen, können Sie einfach mehrere BackgroundWorker-Objekte erstellen

+0

Bis zu einem gewissen Grad stimme ich zu, dass die Antwort nicht vollständig nützlich ist. In Anbetracht der Tatsache, dass Sie * zwei * Hintergrundprozesse ausführen müssen, ist es nicht toll, stattdessen einen Fehler zu erhalten, der sagt "Kann den Arbeiter nicht zweimal ausführen". Ich würde die Antwort über das Ausführen neuer backgroundWorkers für jede Aufgabe annehmen - oder in gewisser Weise eine Aufgabe zu stellen ist eine bessere Lösung, die nicht dazu führt, dass Sie überprüfen müssen, ob ein anderer Teil des Systems den Hintergrundjob bereits gestartet hat und handelt uppon das. – Thies

51

Erstellen Sie ein neues BackgroundWorker-Objekt für jede Operation, die Sie ausführen möchten. Das heißt, statt:

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

Versuchen Sie folgendes:

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

Das ist eine großartige Antwort. Wie töten wir alle Hintergrundarbeiter wenn nötig? –

+0

@VladSpreys Ich kann Thread-Löschung nicht nur in einem Kommentar diskutieren, aber es gibt einige wirklich gute Beiträge auf dieser Seite zum Thema. –

+0

@ fatcat1111 danke. Ich verstehe die Idee des Abbrechens des Threads, wenn wir einen Verweis darauf behalten. Aber mit diesem Code-Ausschnitt tun wir das nicht. –

5

ich in queue'ing die Aufgaben aussehen würde, die erledigt werden müssen. Sie erhalten die folgenden Vorteile;

  • Sie müssen die Probleme der Hintergrundaufgaben nicht behandeln nicht bereits wegen etwas in der Lage zu starten sonst läuft
  • Sie müssen zu viele Threads keine Sorge über die Verwendung von oben, durch einen neuen Hintergrund zu schaffen gearbeitet für jede Aufgabe.
  • Schließlich die Warteschlange könnte können Sie sicherstellen, dass die Hintergrundaufgaben in der gleichen Reihenfolge ausgeführt werden, wie sie erstellt/angefordert wurden.

Hier ist eine Beispielimplementierung: http://thevalerios.net/matt/2008/05/a-queued-backgroundworker. Ich bin nicht sicher, ob die Implementierung in threadsafe, und ich werde meine Antwort aktualisieren, sobald ich herausfinden, von meinem aktuellen Sperrproblem in einer Implementierung, mit der ich arbeite.

+0

Dies ist ein großartiger Ansatz, wenn Multithreading benötigt wird –