Допустим, у меня есть три задачи: a
, b
и c
. Все три гарантированно вызовут исключение в случайное время от 1 до 5 секунд. Затем я пишу следующий код:
await Task.WhenAny(a, b, c);
Это, в конечном итоге, вызовет исключение из любой ошибки задачи, которая сначала вызвала бы ошибку. Поскольку здесь нет try...catch
, это исключение переместится в другое место в моем коде.
Что произойдет, если оставшиеся две задачи вызовут исключение? Разве это не ненаблюдаемые исключения, которые приведут к уничтожению всего процесса? Означает ли это, что единственный способ использовать WhenAny
- внутри блока try...catch
, а затем каким-то образом наблюдать за оставшимися двумя задачами, прежде чем продолжить?
Дальнейшие действия: я бы хотел, чтобы ответ применим как к .NET 4.5 , так и .NET 4.0 с пакетом Async Targeting Pack (хотя в этом случае явно используется TaskEx.WhenAny
).
Task.WaitAny
соблюдает все исключения для всех аргументов, но сейчас я не могу его найти. - person David Pfeffer   schedule 01.10.2012Task.WhenAny()
,await Task.WaitAny()
даже не компилировать. - person svick   schedule 01.10.2012Task.WhenAny
иTask.WaitAny
никогда не будут создавать исключения. - person porges   schedule 25.09.2013await
будет, поскольку он распаковывает исключение, доставленное в результате сбоя Задачи. - person David Pfeffer   schedule 27.10.2016WhenAny
, не бросает. Он возвращает задачу, которая вызвала выполнение WhenAny до завершения, и ожидает выполнения этой задачи. - person Dave Van den Eynde   schedule 27.10.2016