У меня есть 3 задачи, которые должны запускаться параллельно. Мне нужно подождать все 3, а затем продолжить обработку результатов. Так что-то вроде:Как обрабатывать частичный успех в партии задач?
var results = await Task.WhenAll(task1, task2, task3);
return process(results);
Это прекрасно работает, когда все 3 задания успешно завершены. Однако, если один из них терпит неудачу, я получаю исключение, которое пузырится вверх. Это не то, что я хочу. Если какая-либо из этих задач вызывает InvalidOperationException
, я могу продолжить обработку, мне нужен только метод process
, чтобы получить доступ к исключению, которое было выбрано.
Я понимаю, что могу выполнить try...catch
в задачах, но это не похоже на хак. Помимо того, что это семантически некорректно (задача DID не удалась - она не должна возвращаться успешно), если я пошел с таким подходом, так как результат может быть успешным ИЛИ вернуть исключение, мне пришлось бы возвращать настраиваемый тип. Объект Task<T>
, однако, уже предоставляет канал Exception, поэтому я бы предпочел не выполнять двойную работу и просто использовать то, что уже присутствует.
Если вы правильно поняли, вам нужно что-то вроде 'var combinationTask = Task.WhenAll (...); ожидание integerTask.IgnoreExceptions(); процесс возврата (mixedTask); '? Где 'IgnoreExceptions()' позволит «подождать» сбоя «Задача», не вызывая исключения. Или что именно должны содержать «результаты»? – svick
@svick - Я согласен, кажется, что результаты не могут быть согласованным типом. Моя мысль заключается в том, что мне нужно будет работать непосредственно с объектом Task здесь, а не использовать асинхронный/ожидающий фасад. Если я могу гарантировать, что все задачи выполняются до завершения независимо от ошибок, я могу работать с этими объектами задачи, но я не уверен, как это сделать. –
@svick - это 'IgnoreExceptions()' что-то существующее? Я не могу найти его. –