Diferença entre OperationCanceledException e TaskCanceledException?

101

Qual é a diferença entre OperationCanceledExceptione TaskCanceledException? Se eu estiver usando o .NET 4.5 e as palavras-chave async/ await, qual delas devo procurar?

Peter
fonte

Respostas:

117

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".

Jon Skeet
fonte
1
Eu criei um ForEachAsync principalmente do blog de Stephen Toub, blogs.msdn.microsoft.com/pfxteam/2012/03/05/… . Então, se eu lançar uma exceção dentro de um de 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.
Terry