In unserer Anwendung arbeiten wir viel mit async/await und Tasks. Daher verwendet es häufig Task.Run, manchmal mit Unterstützung für die Löschung unter Verwendung der eingebauten CancellationToken
.TaskCancellationException, wie die Ausnahme im Erfolgskontrollfluss vermieden werden kann?
public Task DoSomethingAsync(CancellationToken cancellationToken)
{
return Task.Run(() =>
{
while (true)
{
if (cancellationToken.IsCancellationRequested) break;
//do some work
}
}, cancellationToken);
}
Wenn ich die Ausführung stornieren nun die CancellationToken die Ausführung mit am Anfang der nächsten Schleife stoppt, oder wenn die Aufgabe überhaupt nicht starten wirft es eine Ausnahme (TaskCanceledException innerhalb Task.Run). Die Frage ist nun, warum Task.Run eine Exception verwendet, um die erfolgreiche Löschung zu steuern, anstatt nur eine abgeschlossene Aufgabe zurückzugeben. Gibt es einen bestimmten Grund, warum MS sich nicht an die Regel "KEINE AUSNAHMEN ZUR KONTROLLE DES AUSFÜHRUNGSFLUSSES VERWENDEN" gehalten hat?
Und wie kann ich verhindern, dass jede Methode, die Stornierung (die eine Menge sind) in einem völlig nutzlosen Versuch Catch (TaskCancelledException) Block Boxing unterstützt?
" Stornierung! = Erfolgreicher Abschluss ". Was würden Sie erwarten, dass die Aufgabe 'zurückgegeben wird, wenn sie abgebrochen wird? –
Eine Aufgabeninstanz, die mit ** cancellationTokenSource.Cancel() abgebrochen wird; ** hat den Status ** TaskStatus.RanToCompletion **, nicht den Status ** TaskStatus.Canceled **. –
Sie haben Recht für Aufgaben mit Rückgabewert, für die eine Ausnahme erforderlich ist. Hab nicht darüber nachgedacht. – Console