2016-09-21 1 views
-2

Ich habe eine App, die einen Remote-Server eines Drittanbieters aufruft. Ich verwende einen BackgroundWorker, um Async auszuführen.C# BackgroundWorker - Wie kann man den Status von worker.CancellationPending abbrechen?

Wenn ich CancelAsync() abrufe, um den Remote-Prozess abzubrechen, und dann den Status workers.CancellationPending verwendet, um einen Aufruf der Close() -Methode auf diesem Remote-Server auszulösen, wird auf dem Remote-Server die Meldung "Sie versuchen um diesen Prozess zu beenden, ist das was du willst? " und Ja/Nein-Tasten.

Wenn der Benutzer Ja drückt, dann kein Problem, Remote-Server wird heruntergefahren. Aber wenn der Benutzer Nein drückt, wie storniere ich dann den CancellationPending-Status, so dass mein Prozess fortgesetzt werden kann, bis der Benutzer CancelAsynch() erneut aufruft?

Bearbeiten: Nach der ersten Antwort unten: Wie gehe ich damit um, dass ein Benutzer den Remote-Server nicht schließen kann und ihn laufen lässt, während sich meine App in einem Status befindet, der nicht geändert werden kann?

Edit: Bevor Sie Tastatur Krieger dies als Duplikat markieren, lesen Sie die verdammte Frage.

+0

Werfen Sie einen Blick hier: http://stackoverflow.com/q/4732737/3956100 – Niklas

+0

_ "wie gehe ich mit der Tatsache, dass ein Benutzer wählen kann, den Remote-Server nicht zu schließen "_ - Sie müssen diese Interaktion zurück in den Code drücken, um auftreten _before_ Sie CancelAsync()' aufrufen. Auf diese Weise beenden Sie nicht einen Prozess, der nicht abgebrochen werden sollte. Beachten Sie, dass dadurch auch die Verarbeitung fortgesetzt wird, während der Benutzer darüber nachdenkt, ob er abbrechen möchte oder nicht, was in den meisten Fällen eine gute Sache sein sollte. –

+0

@ Niklas Dieser Link ist nicht das gleiche Problem. –

Antwort

0

CancellationPending soll auf "true" gesetzt werden, wenn Cancel angefordert wurde und nicht auf "false" gesetzt wurde. Das würde zu unvorhersehbarem Verhalten führen: Was wäre, wenn die Annullierung bereits beobachtet worden wäre und was wenn nicht? In einem Fall würde die Operation dennoch abgebrochen und die andere nicht.

+0

Fair genug.Wie kann ich mit der Tatsache umgehen, dass ein Benutzer den Remote-Server nicht herunterfahren kann und ihn laufen lässt, während sich meine App in einem Status befindet, der nicht geändert werden kann? Ich kann eine Markierung setzen, um den CancellationPending-Status zu ignorieren, aber dann kann der Benutzer von dem Punkt, an dem blech ist, nicht abbrechen. –

+0

@DaveTapson haben Sie Zugriff auf .Net Framework 4.5? – Niklas

+0

@ Niklas Ja, ich mache –

0

Als allgemeine Regel sollten Sie keine Benutzerinteraktion in der BackgroundWorker-Logik haben. (Es heißt BackgroundWorker aus einem Grund). Denken Sie daran,

, dass die CancelAsync() asynchron ist, also wenn Sie fragen Sie für Benutzer-Interaktion bei der Berechnung kann die MessageBox später ein paar Sekunden/Minuten Pop-up, wenn der Benutzer etwas ganz anderes tut.

Wenn Sie die Threads ordnungsgemäß isolieren, sollten Sie diese Art von Problemen nicht haben.

Sie sollten um Benutzerbestätigung bitten vor Sie rufen CancelAsync()?

Benutzer fragt nach Abbruch -> Sie fragen nach Bestätigung -> CancelAsync() aufrufen

+0

der Remote-Server ist eine Drittanbieter-App. Ich habe den Scheck nicht dort hingelegt, hat der Entwickler der App getan. –

+0

Da Sie nicht die volle Kontrolle über den Löschvorgang haben, können Sie die Verwendung von 'CancelAsync' vermeiden? Rufen Sie 'Close()' direkt aus dem UI-Thread auf? Oder ist dieser Dienst nicht Thread-sicher? (Wenn das der Fall ist, können Sie eine bool-Variable '_cancellationPending' erstellen, auf der Schließen-Schaltfläche auf true setzen und' CancelAsync' insgesamt vermeiden.) –

Verwandte Themen