Nella nostra applicazione lavoriamo molto con async/await e Task. Pertanto utilizza Task.Run molto, a volte con supporto per l'annullamento utilizzando il built-in CancellationToken
.TaskCancellationException come evitare l'eccezione sul flusso di controllo di successo?
public Task DoSomethingAsync(CancellationToken cancellationToken)
{
return Task.Run(() =>
{
while (true)
{
if (cancellationToken.IsCancellationRequested) break;
//do some work
}
}, cancellationToken);
}
se lo faccio ora annullare l'esecuzione utilizzando il CancellationToken l'esecuzione si ferma all'inizio del ciclo successivo, o se il compito non è stato avviato a tutti viene generata un'eccezione (TaskCanceledException all'interno Task.Run). La domanda è ora perché Task.Run utilizza un'eccezione per controllare l'annullamento con esito positivo invece di restituire solo un'attività completata. C'è qualche ragione specifica per cui MS non si è attenuta alla regola "NON usare le eccezioni per controllare il flusso di esecuzione" ?.
E come posso evitare il Boxing di ogni metodo che supporta la cancellazione (che è molto) in un blocco try catch (TaskCancelledException) completamente inutile?
" Cancellazione! = Completamento riuscito ". Cosa ti aspetteresti 'Task' per tornare quando viene cancellato? –
Un'istanza dell'attività annullata con ** cancellationTokenSource.Cancel(); ** avrà lo ** stato TaskStatus.RanToCompletion **, non lo stato ** TaskStatus.Canceled **. –
Hai ragione per le attività con valore di ritorno è necessaria l'eccezione. Non ci ho pensato. – Console