await
viene utilizzato per i metodi asincroni/delegati, che sia accettano un CancellationToken
e così si dovrebbe passare uno quando si chiama (cioè await Task.Delay(1000, cancellationToken)
), o non lo fanno e non può davvero essere cancellate (ad esempio in attesa di un risultato I/O).
Cosa si può fare però, è abbandonare * questi tipi di attività con questo metodo di estensione:
public static Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken)
{
return task.IsCompleted // fast-path optimization
? task
: task.ContinueWith(
completedTask => completedTask.GetAwaiter().GetResult(),
cancellationToken,
TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
}
Usage:
await task.WithCancellation(cancellationToken);
* Il compito abbandonata non ottiene cancellato, ma il tuo codice si comporta come se lo fosse. Termina con un risultato/eccezione o rimarrà in vita per sempre.
possibile duplicato di [token di cancellazione in attesa metodo] (http://stackoverflow.com/questions/13822726/cancellation-token-in-await-method) –
No, ho visto quello e non ho trovato la risposta Là. Per favore, rimuovi l'indicatore di duplicazione, a meno che non sia spiegato perché sono duplicati. – mark