В чем разница между OperationCanceledException
и TaskCanceledException
? Если я использую .NET 4.5 и использую ключевые слова async
/ await
, какое из них мне следует искать?
Ответы:
OperationCanceledException
является просто базовым классом для TaskCanceledException
- поэтому, если вы поймаете первый, вы все равно поймаете второй.
Некоторые операции с параллельными коллекциями OperationCanceledException
вызывают просто так , поскольку не задействованы никакие фактические задачи (по крайней мере, в том, что касается общедоступного API). См. BlockingCollection.TryTake
Пример.
Я бы поймал это на OperationCanceledException
всякий случай, если задача отменена из-за операции, которая сама только что сгенерировала OperationCanceledException
- вы, вероятно, все еще хотите рассматривать это как «простую отмену».
await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );
объекта, оно каким-то образом «изменяется» на TaskCanceledException. Есть идеи, как это могло быть? Это проблема для меня, поскольку я хочу поймать «истинное» исключение OperationCanceledException с помощью catch (OperationCanceledException), но я не хочу, чтобы это исключение TaskCanceledException (которое действительно должно быть ApplicationException).