Разница между OperationCanceledException и TaskCanceledException?

101

В чем разница между OperationCanceledExceptionи TaskCanceledException? Если я использую .NET 4.5 и использую ключевые слова async/ await, какое из них мне следует искать?

Питер
источник

Ответы:

117

OperationCanceledExceptionявляется просто базовым классом для TaskCanceledException- поэтому, если вы поймаете первый, вы все равно поймаете второй.

Некоторые операции с параллельными коллекциями OperationCanceledExceptionвызывают просто так , поскольку не задействованы никакие фактические задачи (по крайней мере, в том, что касается общедоступного API). См. BlockingCollection.TryTakeПример.

Я бы поймал это на OperationCanceledExceptionвсякий случай, если задача отменена из-за операции, которая сама только что сгенерировала OperationCanceledException- вы, вероятно, все еще хотите рассматривать это как «простую отмену».

Джон Скит
источник
1
Я придумал ForEachAsync в основном из блога Стивена Туба blogs.msdn.microsoft.com/pfxteam/2012/03/05/… . Затем, если я генерирую исключение внутри await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );объекта, оно каким-то образом «изменяется» на TaskCanceledException. Есть идеи, как это могло быть? Это проблема для меня, поскольку я хочу поймать «истинное» исключение OperationCanceledException с помощью catch (OperationCanceledException), но я не хочу, чтобы это исключение TaskCanceledException (которое действительно должно быть ApplicationException).
Терри