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?

Peter
la source

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

Jon Skeet
la source
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