Différence entre OperationCanceledException et TaskCanceledException?


101

Quelle est la différence entre OperationCanceledExceptionet TaskCanceledException? Si j'utilise .NET 4.5 et que j'utilise les mots async- awaitclés / , lequel devrais-je chercher?

Réponses:


117

OperationCanceledExceptionest simplement la classe de base pour TaskCanceledException- donc si vous attrapez la première, vous attraperez toujours la seconde.

Certaines opérations sur des collectes simultanées sont lancées simplement OperationCanceledException, car il n'y a pas de tâches réelles impliquées (du moins en ce qui concerne l'API publique). Voir BlockingCollection.TryTakepour un exemple.

J'attraperais le OperationCanceledExceptionjuste au cas où la tâche serait annulée en raison d'une opération qui vient d'être lancée OperationCanceledException- vous voudrez probablement toujours traiter cela comme une "annulation juste".


1
Je suis venu avec un ForEachAsync principalement à partir du blog de Stephen Toub blogs.msdn.microsoft.com/pfxteam/2012/03/05/… . Ensuite, si je lève une exception à l'intérieur d'une, await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );elle est «changée» en TaskCanceledException. Une idée de comment cela pourrait être? C'est un problème pour moi car je veux attraper une 'vraie' OperationCanceledException via catch (OperationCanceledException) mais je ne veux pas que cette TaskCanceledException (qui devrait vraiment être ApplicationException) soit interceptée.
Terry
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.