Unterschied zwischen OperationCanceledException und TaskCanceledException?

101

Was ist der Unterschied zwischen OperationCanceledExceptionund TaskCanceledException? Wenn ich .NET 4.5 und die Schlüsselwörter async/ verwende await, nach welchen sollte ich suchen?

Peter
quelle

Antworten:

117

OperationCanceledExceptionist einfach die Basisklasse für TaskCanceledException- wenn Sie also die erstere fangen, werden Sie immer noch die letztere fangen.

Einige Vorgänge für gleichzeitige Sammlungen werden nur ausgelöst OperationCanceledException, da keine tatsächlichen Aufgaben erforderlich sind (zumindest was die öffentliche API betrifft). Siehe BlockingCollection.TryTakefür ein Beispiel.

Ich würde das OperationCanceledExceptionnur für den Fall fangen, dass die Aufgabe aufgrund einer Operation abgebrochen wird, die selbst gerade geworfen wurde OperationCanceledException- Sie möchten das wahrscheinlich immer noch als "nur Abbrechen" behandeln.

Jon Skeet
quelle
1
Ich habe mir einen ForEachAsync ausgedacht, hauptsächlich aus Stephen Toubs Blog blogs.msdn.microsoft.com/pfxteam/2012/03/05/… . Wenn ich dann eine Ausnahme await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );in eine Art auslöse, wird sie in eine TaskCanceledException 'geändert'. Irgendeine Idee, wie das sein könnte? Dies ist ein Problem für mich, da ich eine 'echte' OperationCanceledException über catch (OperationCanceledException) abfangen möchte, aber ich möchte nicht, dass diese TaskCanceledException (die eigentlich ApplicationException sein sollte) abgefangen wird.
Terry