Информация об изменениях

Сообщение Re[3]: Дождаться пока все завершат работу... от 12.03.2020 18:29

Изменено 12.03.2020 18:49 RushDevion

Re[3]: Дождаться пока все завершат работу...
S>Проблема в том, что нужно на каждом асинхронном методе перехватывать TaskCanceledException.
Начальная постановка задачи у вас какая?
Тригернуть отмену и дождаться, когда все закончится. Так?
Вот и не нужно ничего перехватывать.
Ну вывалится из дочерней таски TaskCancelledException наружу, ну зафейлит вашу таску.
Task.WhenAll().Wait() все равно дождется всеобщего окончания.
Дальше нужно просто пробежаться по списку тасков и потрогать Exception у всех Faulted, чтобы UnobservedTaskException не выстелило.
Re[3]: Дождаться пока все завершат работу...
S>Проблема в том, что нужно на каждом асинхронном методе перехватывать TaskCanceledException.
Начальная постановка задачи у вас какая?
Тригернуть отмену и дождаться, когда все закончится. Так?
Вот и не нужно ничего перехватывать.
Ну вывалится из дочерней таски TaskCancelledException наружу, ну зафейлит вашу таску.
Task.WhenAll().Wait() все равно дождется всеобщего окончания.
Дальше нужно просто пробежаться по списку тасков и потрогать Exception у всех Faulted, чтобы UnobservedTaskException не выстелило.

Более того TaskCancelledException — это наследник OperationCancelledException.
Значит, если первичная ваша таска (1) создавалась с тем же cancellation token, что вы передаете в await Task.Delay(),
то вылетевший в последнем TaskCancelledException будет трактоваться (1) как отмена и она перейдет не в Faulted, а в Cancelled state.