Brauchen Sie Hilfe, um den BackgroundWorker-Thread zu stoppen

8

Brauchen Sie Hilfe, um den BackgroundWorker-Thread zu stoppen. Ich versuche, einen Hintergrund-Worker-Thread zu stoppen. Das mache ich:

Auf Stop-Schaltfläche klicken (UI-Ebene):

%Vor%

Beim DoWork-Ereignis (UI-Ebene):

%Vor%

Wenn das DoWork-Ereignis ausgelöst wird und meine Programmsteuerung in der in der Business-Schicht definierten Funktion ist, wie kann ich zum DoWork-Ereignis zurückkehren, um 'e.Cancel = true' zu setzen?

    
Tina 14.02.2011, 11:52
quelle

5 Antworten

3

Einstellung e.Cancel tut nichts, wenn CancellationPending wahr ist, müssen Sie grundsätzlich aus DoWork () mit return oder was auch immer ausbrechen (nachdem Sie aufgehört haben, was Sie tun).

Etwas wie:

%Vor%

DoWork () wird in einem separaten Thread für den UI-Thread ausgeführt. Sie können dann mithilfe von BackgroundWorkr.ReportProgress () an den UI-Thread berichten.

    
Lloyd 14.02.2011 11:56
quelle
2

DoWork wird in einem eigenen Thread ausgeführt und ist nicht vom GUI-Thread abhängig.

Du machst fast alles richtig. Legen Sie im GUI-Thread CancellationPending auf true fest.

In der Methode DoWork haben Sie wahrscheinlich eine Art Schleife.

Hier prüfen Sie, ob CancellationPending == true , aber zusätzlich zu e.Cancel auf true setzen Sie auch einen return Aufruf ein, um die Methode zurückzugeben und den Worker effektiv zu stoppen. Dies führt auch dazu, dass das WorkerCompleted-Ereignis auf dem GUI-Thread ausgelöst wird, wenn die Methode angeschlossen ist.

Wenn die DoWork -Methode eine lange Aufgabe ausführt, die nicht in Teile unterteilt ist (zB wenn Ihre DoWork -Methode wie folgt aussieht:

%Vor%

Dann haben Sie Pech, denn Sie müssen das CancellationPending in der Methode DoWork manuell überprüfen, um es stoppen zu können. Wenn das DoWork selbst "hängt" und auf eine Operation wartet, die Sie nicht steuern können, können Sie es nicht (in geordneter Weise) stoppen, indem Sie CancellationPending aus dem GUI-Thread setzen.

    
Øyvind Bråthen 14.02.2011 11:55
quelle
2
  

Wenn das DoWork-Ereignis ausgelöst wird und meine Programmsteuerung in der in der Business-Schicht definierten Funktion ist, wie kann ich zum DoWork-Ereignis zurückkehren, um 'e.Cancel = true' zu setzen?

Sie nicht. Wenn Sie während der Ausführung Ihrer Business-Schicht eine Stornierung durchführen möchten, muss Ihre Business-Schicht die Stornierung unterstützen. Also, Sie haben zwei Möglichkeiten:

  1. Rufen Sie in Ihrer DoWork-Methode nur Kurzzeit-Business-Layer-Methoden auf, und prüfen Sie zwischenzeitlich auf CancellationPending.
  2. Machen Sie Ihre Business-Layer-Methoden kündigungsfähig, d. h. übergeben Sie den BackgroundWorker an sie und lassen Sie sie regelmäßig CancellationPending prüfen (und wiederholen, sobald es wahr wird).
Heinzi 14.02.2011 11:57
quelle
0

Überprüfen Sie weiterhin das CancellationPending = True-Flag im else-Teil Ihrer Logik und geben Sie es zurück, wenn es wahr ist.

    
tzup 14.02.2011 11:57
quelle
0

Der Code e.Cancel = true setzt nur einen Zustand auf dem BackgroundWorker, so dass er weiß, dass er abgebrochen wurde, er bricht den Prozess nicht ab.

Sie müssen CancellationPending in der Schleife Ihrer Methode und break it oder return überprüfen.

%Vor%     
Seb Nilsson 14.02.2011 11:58
quelle

Tags und Links