Ich muss die Ausführung einer Aufgabe stoppen, wenn der Benutzer die Escape-Taste drückt. Das Problem ist die Aufgabe, ein Verfahren läuft wie:Eine Aufgabe mit langer verschachtelter Schleife stoppen
void Start(){
while(long loop){
while(!userEvent) System.Windows.Forms.Application.DoEvents();
for(another long loop){
while(more loops)
}
}
}
Und alles, was ich habe gerade die Foren zu diesem Thema gelernt, dass CancellationToken verwenden Sie es so behandeln müssen:
if (token.IsCancellationRequested)
{
// Clean up here, then...
"cleanup".Dump();
token.ThrowIfCancellationRequested();
}
Da es so viele Schleifen gibt, wäre es sehr ineffizient und hässlich zu lesen, ob die Löschung angefordert wird.
Die Aufgabe muss aufhören, wenn das Fenster der inneren Ereignisse aus dem so gelesen werden kann ich nicht nur die CancellationToken vor der nächsten Iteration überprüfen, sie müßten ziemlich überall
So sein, ist es eine Möglichkeit, die Aufgabe zu stoppen, egal in welcher Schleife sie ist? Es muss nicht mit CancellationTokens sein, aber es scheint die "Standard" -Methode zu sein.
Auch wurde die Methode Start() zunächst nicht als Aufgabe verwendet, aber das würde es so machen, dass der Hauptthread auch nach dem Schließen des Fensters den Code ausführte, es sei denn, ich benutzte eine Menge if (windowClosed) break
, die ebenso unpraktisch waren .
Wenn Sie einen 'throw' verwenden, um abzubrechen, brauchen Sie nur das' if (token.IsCancellationRequested) 'in der inneren Schleife (oder 1 oder 2 Ebenen darüber, abhängig von der akzeptablen Latenz). –
@HenkHolterman Ich glaube, ich habe vergessen hinzuzufügen, dass die Aufgabe gestoppt werden muss, wenn ich das Fenster schließe, von dem die Ereignisse gelesen werden. Dazu würde der Thread im 'while (! UserEvent) ... hängen bleiben, also wäre die Latenz zu groß. – mjgalindo
Ich sehe das Problem/Unterschied nicht. Das OnClosing-Ereignis kann die Abbruchanforderung auslösen, oder? –