Differenza tra OperationCanceledException e TaskCanceledException?


101

Qual'è la differenza tra OperationCanceledExceptione TaskCanceledException? Se utilizzo .NET 4.5 e utilizzo le parole chiave async/ await, quale dovrei cercare di catturare?

Risposte:


117

OperationCanceledExceptionè semplicemente la classe base per TaskCanceledException- quindi se prendi la prima, continuerai a catturare la seconda.

Alcune operazioni su raccolte simultanee vengono generate semplicemente OperationCanceledException, poiché non sono coinvolte attività effettive (almeno per quanto riguarda l'API pubblica). Vedi BlockingCollection.TryTakeper un esempio.

Vorrei prendere il OperationCanceledExceptionsolo nel caso in cui l'attività venga annullata a causa di un'operazione che si è appena lanciata OperationCanceledException- probabilmente vuoi ancora trattarla come "solo annullamento".


1
Ho creato un ForEachAsync principalmente dal blog di Stephen Toub blogs.msdn.microsoft.com/pfxteam/2012/03/05/… . Quindi se lancio un'eccezione all'interno di un in await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );qualche modo, viene "modificata" in TaskCanceledException. Qualche idea di come potrebbe essere? Questo è un problema per me in quanto voglio catturare un'eccezione OperationCanceledException 'vera' tramite catch (OperationCanceledException) ma non voglio che questa TaskCanceledException (che dovrebbe essere davvero ApplicationException) catturata.
Terry
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.