Respostas:
OperationCanceledExceptioné simplesmente a classe base para TaskCanceledException- portanto, se você pegar a primeira, ainda assim conseguirá a última.
Algumas operações em coleções concorrentes lançam apenas OperationCanceledException, visto que não há nenhuma tarefa real envolvida (pelo menos no que diz respeito à API pública). Veja BlockingCollection.TryTakepor exemplo.
Eu pegaria o OperationCanceledExceptioncaso a tarefa seja cancelada devido a uma operação que acabou de ser executada OperationCanceledException- você provavelmente ainda quer tratar isso como "apenas cancelamento".
await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );alguma forma, ela é 'alterada' para uma TaskCanceledException. Alguma ideia de como isso pode ser? Isso é um problema para mim, pois quero capturar uma OperationCanceledException 'verdadeira' por meio de captura (OperationCanceledException), mas não quero que essa TaskCanceledException (que realmente deveria ser ApplicationException) seja capturada.