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?
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.
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:
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.
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:
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.