2012-10-23 13 views

Odpowiedz

75

OperationCanceledException to po prostu podstawowa klasa dla TaskCanceledException - więc jeśli złapiesz tego pierwszego, złapiesz go jeszcze.

Niektóre operacje na zbieżnych kolekcjach rzucają tylko OperationCanceledException, ponieważ nie są zaangażowane żadne konkretne zadania (przynajmniej w zakresie publicznego interfejsu API). Zobacz przykład BlockingCollection.TryTake.

Chciałbym złapać OperationCanceledException właśnie w przypadku, gdy zadanie zostanie anulowane z powodu operacji, która sama rzuciła OperationCanceledException - prawdopodobnie nadal chcesz traktować to jako "tylko anulowanie".

+1

Wymyśliłem ForEachAsync głównie z bloga Stephena Touba https://blogs.msdn.microsoft.com/pfxteam/2012/03/05/implementing-a-simple-foreachasync-part-2/. Następnie, jeśli wyrzucę wyjątek wewnątrz 'await enumerable.ForEachAsync (async() => {throw new wyjątek ApplicationException (" Test ");});" w jakiś sposób jest "zmieniony" na wyjątek TaskCanceledException. Jakiś pomysł, jak to może być? Jest to dla mnie problem, ponieważ chcę złapać "prawdziwy" OperationCanceledException za pomocą catch (OperationCanceledException), ale nie chcę, aby ten wyjątek TaskCanceledException (który powinien być naprawdę wyjątkiem ApplicationException). – Terry

Powiązane problemy