Es gibt einen Unterschied beim Abbrechen einer laufenden Aufgabe und bei einer Aufgabe, deren Ausführung geplant ist.
Nach dem Aufruf der Task.Run-Methode wird die Aufgabe nur geplant und wahrscheinlich noch nicht ausgeführt.
Wenn Sie die Task.Run (..., CancellationToken) -Familie von Überladungen mit Abbruchunterstützung verwenden, wird das Abbruch-Token überprüft, wenn die Aufgabe ausgeführt wird. Wenn das Storno-Token IsCancellationRequested zu diesem Zeitpunkt auf true gesetzt hat, wird eine Ausnahme vom Typ TaskCanceledException ausgelöst.
Wenn die Aufgabe bereits ausgeführt wird, muss die Task die ThrowIfCancellationRequested-Methode aufrufen oder einfach die OperationCanceledException auslösen.
Laut MSDN, es ist nur eine bequeme Methode für die folgenden:
if (Token.IsCancellationRequested) Wirf neue OperationCanceledException (Token);
Nicht die andere Art von Ausnahme in diesen beiden Fällen verwendet:
catch (TaskCanceledException ex)
{
// Task was canceled before running.
}
catch (OperationCanceledException ex)
{
// Task was canceled while running.
}
Beachten Sie auch, dass TaskCanceledException
von OperationCanceledException
ableitet, so können Sie nur eine catch
-Klausel für die OperationCanceledException
Typ:
catch (OperationCanceledException ex)
{
if (ex is TaskCanceledException)
// Task was canceled before running.
// Task was canceled while running.
}
siehe aktualisierte Frage - Wenn es kooperativ ist, warum funktioniert der zweite? – Aliostad
Die CancellationTokenSource wird mit einem Timeout eingerichtet. Wenn Task.Delay anstelle von Thread.Sleep verwendet wird, kann die Ausnahme ausgelöst werden. –
@Aliostad - 'Tasks 'warten möglicherweise darauf, für eine bestimmte Zeit geplant zu werden, bevor ihr Code tatsächlich ausgeführt wird. Eine offensichtliche Optimierung für eine Aufgabe, die mit einem Abbruch-Token versehen wurde, besteht darin, dieses Token zu überprüfen, bevor Sie die Aufgabe tatsächlich für einen Thread planen. Im zweiten Fall, wenn diese Prüfung durchgeführt wird, wurde die Stornierung bereits angefordert, so dass die Aufgabe nie wirklich gestartet wird. –