Różnica między OperationCanceledException i TaskCanceledException?

101

Jaka jest różnica między OperationCanceledExceptioni TaskCanceledException? Jeśli używam .NET 4.5 i używam słów kluczowych async/ await, które z nich mam szukać?

Piotr
źródło

Odpowiedzi:

117

OperationCanceledExceptionjest 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.TryTakena przykład.

Wyłapałbym to na OperationCanceledExceptionwszelki 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”.

Jon Skeet
źródło
1
Wymyśliłem ForEachAsync głównie z bloga Stephena Toub blogs.msdn.microsoft.com/pfxteam/2012/03/05/… . Następnie, jeśli w 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).
Terry