Mam 3 zadania, które powinny działać równolegle. Muszę czekać na wszystkie 3, a następnie kontynuować przetwarzanie ich wyników. Tak coś takiego:Jak radzić sobie z częściowym sukcesem w grupie zadań?
var results = await Task.WhenAll(task1, task2, task3);
return process(results);
Działa to dobrze, gdy wszystkie 3 zadania zakończą się powodzeniem. Jeśli jednak któryś z nich zawiedzie, otrzymuję wyjątek, który powoduje bąbelki na całej linii. Nie tego chcę. Jeśli którekolwiek z tych zadań rzuca InvalidOperationException
mogę kontynuować przetwarzanie, po prostu potrzebuję metody process
, aby uzyskać dostęp do wyjątku, który został zgłoszony.
Zdaję sobie sprawę, że mogę try...catch
w ramach zadań, ale to nie wydaje się być hack. Poza tym, że nie jest to semantycznie niepoprawne (zadanie DID nie powiodło się - nie powinno powracać pomyślnie), jeśli zastosowałem to podejście, ponieważ wynik może się powieść LUB zwróci wyjątek, musiałbym zwrócić niestandardowy typ. Obiekt Task<T>
już jednak ujawnia kanał wyjątków, więc wolałbym nie wykonywać podwójnego obowiązku i po prostu użyć tego, co już jest.
Jeśli dobrze rozumiem, chcesz coś jak 'var combinedTask = Task.WhenAll (...); czekać na combinedTask.IgnoreExceptions(); proces powrotu (combinedTask); '? Gdzie 'IgnoreExceptions()' umożliwiałoby 'czekanie' na błędne' Zadanie' bez wyrzucania wyjątku. Albo co dokładnie powinno zawierać "wyniki"? – svick
@svick - Zgadzam się, wydaje się, że wyniki nie mogą być spójne. Moją myślą jest, że będę musiał pracować bezpośrednio z obiektem Task tutaj i nie używać fasady async/await. Jeśli mogę zagwarantować, że wszystkie zadania będą wykonywane do końca bez względu na błędy, będę mógł pracować z tymi obiektami zadań, ale nie jestem pewien, jak to zrobić. –
@svick - jest 'IgnoreExceptions()' coś, co istnieje? Nie mogę tego znaleźć. –