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?

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.