2009-09-11 6 views
6

Abbrechen Ich möchte sofort eine Methode zu stoppen, wenn ich Abbrechen in der "Verarbeitung" Animation Bildschirm drücken. Ich verwende Async-Anrufe über Delegierte. Ist es möglich, die Ausführung der Methode durch Delegierte sofort zu stoppen?Kann ich Methoden durch Delegaten in C#

Danke :)

Antwort

9

Nein - zumindest nicht sauber. (Ich schließe Thread.Abort nicht als "sauber" ein.) Was Sie tun sollten, ist ein Mechanismus, um dem Delegierten mitzuteilen, dass Sie versuchen, um es abzubrechen. Ihr Delegierter müsste dann gelegentlich diese Stornierungsmarkierung überprüfen und entsprechend reagieren.

Parallel Extensions hat überall eine Annullierung eingebaut (und insbesondere Annullierungstoken, um nur die entsprechenden Teile des Codes zu erlauben, die Aufgabe abzubrechen). Es ist alles noch kooperativ, soweit ich weiß. Eine erzwungene Löschung birgt immer das Risiko, den Zustand zu beschädigen.

1

Wie Jon bereits gesagt hat, können Sie keinen Thread sagen: "Bitte hören Sie jetzt auf" und erwarten, dass der Thread gehorcht. Thread.Abort wird nicht sagen, dass es aufhören soll, wird es einfach "trennen". :)

Was ich in der Vergangenheit getan habe, war eine Reihe von "if (wehavetostop)" innerhalb der Thread-Code und wenn der Benutzer eine "Abbrechen" gedrückt legte ich wehavetostop == wahr.

Es ist nicht zu elegant und in einigen Fällen kann es schwierig sein, die "if" -Prüfungen zu setzen, besonders wenn Ihr Thread einen "langen" Vorgang ausführt, den Sie nicht teilen können.

Wenn Sie versuchen, eine Netzwerkverbindung herzustellen (und es dauert Zeit) und Sie wirklich denken, dass eine "abnormale" Beendigung des Threads keinen korrumpierenden Zustand verursachen würde, können Sie es verwenden, aber denken Sie daran, dass Sie nicht können vertraue dem Zustand der Dinge, die an diesem Thread beteiligt waren.

5

Sie können System.ComponentModel.BackgroundWorker verwenden. Es unterstützt die Löschung, so dass Sie den Standardcode nicht schreiben müssen. Client-Code kann einfach CancelAsyn Methode aufrufen und Sie können CancellationPending Eigenschaft in Ihrem Code überprüfen, wann und wo es sinnvoll ist, festzustellen, ob der Client die Operation abgebrochen hat und Kaution.

Verwandte Themen