Wie erzwinge ich eine Aufgabenlöschung?

8

Angenommen, es gibt eine Aufgabe, die ungefähr die folgenden Aktionen enthält:

%Vor%

Und es gibt ziemlich ungeduldige Benutzer. Sie sehnen sich danach, meine Bewerbung sofort zu beenden. Sie wollen nicht warten, solange eine lange Aktion läuft.

Ich habe die Klasse Thread verwendet und konnte alle meine Threads sofort abbrechen, indem ich den Befehl Abort() aufruft.

Wie kann ich meine Aufgaben sofort abbrechen?

Danke.

    
Jean Louis 14.03.2011, 13:19
quelle

2 Antworten

2
  

Sie sehnen sich danach, meine Bewerbung sofort zu beenden. Sie wollen nicht warten, solange eine lange Aktion läuft.

Standardmäßig werden Aufgaben auf dem ThreadPool als Hintergrundaufgaben ausgeführt. Sie können die Anwendung sicher beenden, ohne sich um Hintergrundthreads zu kümmern.

Solange Sie Ihren Prozess beenden möchten, ist das kein Problem.

Beachten Sie, dass Thread.Abort () schnell aber nicht sicher war. Nicht einmal für eine beendende Anwendung, aber dann würde es selten ein echtes Problem verursachen.

    
Henk Holterman 14.03.2011, 13:28
quelle
18

Sie können nicht erzwingen, dass eine Aufgabe unkooperativ abgebrochen wird. Das unkontrollierte Abbrechen eines Threads ist unsicher und daher absichtlich nicht unterstützt.

Sie sollten stattdessen Ihre Do_something_over_a_long_period_of_time -Aufrufe kündbar machen (d. h. übergeben Sie ihnen das Token, und machen Sie sie auch regelmäßig überprüfen).

BEARBEITEN: Wie in einer anderen Antwort erwähnt, können Sie die -Anwendung beenden, indem Sie sicherstellen, dass alle Vordergrund-Threads beendet sind. Aber Sie müssen sich darüber im Klaren sein, dass Ihre Aufgaben nicht unbedingt die Möglichkeit hatten, sauber zu beenden. Wenn sie Dinge wie das Schreiben von Dateien tun, möchten Sie vielleicht warten, bis die Löschung bemerkt wurde, um den permanenten Zustand nicht zu beschädigen.

    
Jon Skeet 14.03.2011 13:22
quelle