Mam metodę, która tworzy niektóre zadania, a następnie czeka na nich z WaitAll przed powrotem. Problem polega na tym, że jeśli te zadania zostały anulowane, to WaitAll wyrzuci AggregateException zawierający partie TaskCanceledException.Jak mogę czekać na zadania bez rzucania wyjątków TaskCanceledExceptions?
Oznacza to, że WaitAll rzuci wyjątków w dwóch różnych okolicznościach:
- Wyjątki, które wskazują prawdziwego błędu. Oznacza to, że był warunek, którego nie znaliśmy; muszą propagować jako nieobsługiwane wyjątki, dopóki ostatecznie nie zakończą procesu.
- Wyjątki wskazujące, że użytkownik kliknął przycisk Anuluj. Oznacza to, że zadanie zostało anulowane i wyczyszczone, a program powinien nadal działać normalnie.
jest montowany prostopadle w definicji vexing exception: to wyjątek wrzucony zupełnie nie wyjątkowych okolicznościach, więc złapać ją, aby powrócić do normalnego przepływu sterowania. Na szczęście łatwo go złapać, prawda? Po prostu dodaj catch (AggregateException)
i - och, czekaj, to ten sam typ, który zostanie zgłoszony, gdy wystąpi błąd krytyczny.
Muszę poczekać, aż zadania zakończą się, zanim wrócę (muszę wiedzieć, że nie używają już swoich połączeń z bazami danych, uchwytów plików ani niczego innego), więc potrzebuję WaitAll lub czegoś takiego podobny. A jeśli jedno z zadań zostało zarzucone, chcę, aby te wyjątki były propagowane jako nieobsługiwane wyjątki. Po prostu nie chcę wyjątków do anulowania.
W jaki sposób mogę zapobiec dodawaniu wyjątków w przypadku anulowanych zadań przez użytkownika WaitAll
?
użyć przeciążenie, że trwa CancellationToken. –
@HansPassant, dokumenty dla tego przeciążenia w rzeczywistości nie mówią tego, do czego używa tokena. Czy zignoruje TaskCanceledExceptions powiązane z tym tokenem, czy też po prostu powróci wcześniej, jeśli token zostanie anulowany? Nie potrzebuję powrotu, dopóki wszystkie zadania nie przestaną działać. –
Do anulowania zadań służy znacznik Anulowanie. I odfiltruj specyficzny wyjątek OperationCancelException, który teraz otrzymasz. –