2012-10-30 7 views
5

Ich versuche, einen Weg, um herauszufinden, zu überprüfen, ob ein Background Thread am Leben ist (dh noch läuft der Faden im Wesentlichen als eine einfache Endlosschleife implementiert wird.Ist IsBusy von BackgroundWorker identisch mit "IsAlive"?

while (AllConditionsMet()) 
{ 
    DoSomeMagic(); 
    Thread.Sleep(10000); 
} 

Die nächste Sache zu IsAlive() fand ich so weit aber die IsBusy Eigenschaft, da mein Thread Sleep() s die meiste Zeit, ich bin nicht sicher, ob dies die Arbeit machen wird

Kann ich auf IsBusy zählen zu tun.

if (!myWorker.IsBusy) 
    RestartWorker(); 

oder rufe ich nach Ärger?

+1

Wenn isBusy falsch ist, führt der Backgroundworker keine Arbeit aus, so dass Sie nicht in Schwierigkeiten geraten, wenn Sie den angezeigten Code verwenden. Nur die Methode "RestartWorker()" ist falsch, weil der Worker nicht gestartet wurde. Aber das ist eher eine Sprache als ein Programmierproblem. – jAC

+2

Sie bitten um Probleme, wenn Sie Code innerhalb des Threads implementieren, um sich selbst neu zu starten. Es wäre besser, einen Fehlerzustand zu erkennen, den Thread zu beenden und einen ganz neuen Thread neu zu starten. Sonst könnte es sehr wahrscheinlich zu einer Deadlock-Situation kommen. –

Antwort

12

BackgroundWorker.IsBusy wahr ist, solange die DoWork Event-Handler beschäftigt ist und die RunWorkerCompleted Ereignishandler wurde noch nicht ausgeführt. Beachten Sie die letztere Klausel, die Eigenschaft nicht sagt Ihnen, ob Ihre Schleife aktiv ist.

Darüber hinaus gibt es in Ihrem zweiten Snippet eine recht unangenehme Wettlaufsituation. IsBusy könnte in der if()-Anweisung stimmen, aber eine Nanosekunde später falsch sein. Die Rasse, die einmal im Monat zuschlägt. Die Absicht des Codes ist schwer aus den Snippets zu ergründen, die so schwer zu umgehen sind. Denken Sie immer nur daran, ein neues BGW-Objekt zu erstellen, das niemals rennen wird. Es hilft auch, diese Schleife loszuwerden, ein Thread, der 10 Sekunden lang schläft, verschwendet eine sehr teure Systemressource, wenn er nichts tut. Und es gummiert den Threadpool-Scheduler.

4

Vom docs:

wahr, wenn der Background ist eine asynchrone Operation ausgeführt wird; andernfalls false.

Egal, ob Sie die Worker-Thread schlafen oder nicht, es ist immer noch tun etwas so IsBusy verwenden, sollten in Ordnung sein.

5

Um sicherzustellen, dass der Backgroundworker wirklich gestoppt wurde, können Sie ihn manuell beenden. Set yourBackgroundWorker.WorkerSupportsCancellation = true;. Dann stoppen Sie einfach den Backgroundworker mit:

yourBackgroundWorker.CancelAsync(); 

Noch isBusy sollte genug sein, um eine laufende/Arbeits Instanz Ihrer BackgroundWorker zu erkennen.