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.