Свяжите CancellationToken с задачей асинхронного метода
Вопрос: Есть ли способ связатьCancellationToken
сTask
вернулся изasync
метод?
Как правило,Task
в конечном итоге вотменен указать, еслиOperationCancelledException
брошен сCancellationToken
соответствуетTask
CancellationToken
, Если они нет, то задача переходит вразорванный государство:
void WrongCancellationTokenCausesFault()
{
var cts1 = new CancellationTokenSource();
var cts2 = new CancellationTokenSource();
cts2.Cancel();
// This task will end up in the Faulted state due to the task's CancellationToken not matching the thrown
// OperationCanceledException's token.
var task = Task.Run(() => cts2.Token.ThrowIfCancellationRequested(), cts1.Token);
}
С /async
await
Я не имеют нашел способ установить методTask
CancellationToken
(и таким образом достичь такой же функциональности). Из моего тестирования кажется, чтолюбой OperationCancelledException
вызоветasync
Способ входа в Отмененное состояние:
async Task AsyncMethodWithCancellation(CancellationToken ct)
{
// If ct is cancelled, this will cause the returned Task to be in the Cancelled state
ct.ThrowIfCancellationRequested();
await Task.Delay(1);
// This will cause the returned Task to be in the Cancelled state
var newCts = new CancellationTokenSource();
newCts.Cancel();
newCts.Token.ThrowIfCancellationRequested();
}
Было бы неплохо иметь немного больше контроля, так как если метод, который я вызываю из моегоasync
метод отменен (и я нене ожидаем отмены - т.е. это не этоTask
CancellationToken
), Я ожидаю, что задание войдет в состояние Failed, а не в состояние Cancelled.