В чем разница между 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).