Odpowiedzi:
OperationCanceledException
jest po prostu klasą bazową dla TaskCanceledException
- więc jeśli złapiesz pierwszą, nadal będziesz łapać drugą.
Niektóre operacje na kolekcjach współbieżnych są wyrzucane po prostu OperationCanceledException
, ponieważ nie ma żadnych rzeczywistych zadań (przynajmniej jeśli chodzi o publiczny interfejs API). Zobacz BlockingCollection.TryTake
na przykład.
Wyłapałbym to na OperationCanceledException
wszelki wypadek, gdyby zadanie zostało anulowane z powodu operacji, która właśnie się wyrzuciła OperationCanceledException
- prawdopodobnie nadal chcesz traktować to jako „zwykłe anulowanie”.
await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );
jakiś sposób rzucę wyjątek wewnątrz obiektu, zostanie on „zmieniony” na wyjątek TaskCanceledException. Masz jakiś pomysł, jak to może być? Jest to dla mnie problem, ponieważ chcę przechwycić „prawdziwy” wyjątek OperationCanceledException za pośrednictwem catch (OperationCanceledException), ale nie chcę, aby ten wyjątek TaskCanceledException (który naprawdę powinien być ApplicationException).