¿Diferencia entre OperationCanceledException y TaskCanceledException?

101

¿Cuál es la diferencia entre OperationCanceledExceptiony TaskCanceledException? Si estoy usando .NET 4.5 y uso las palabras clave async/ await, ¿cuál debería buscar?

Pedro
fuente

Respuestas:

117

OperationCanceledExceptiones simplemente la clase base para TaskCanceledException, por lo que si detecta la primera, aún obtendrá la última.

Algunas operaciones en colecciones concurrentes arrojan solo OperationCanceledException, ya que no hay tareas reales involucradas (al menos en lo que respecta a la API pública). Vea BlockingCollection.TryTakeun ejemplo.

Lo captaría por OperationCanceledExceptionsi acaso la tarea se cancela debido a una operación que acaba de lanzarse OperationCanceledException; probablemente aún quiera tratar eso como "solo cancelación".

Jon Skeet
fuente
1
Se me ocurrió un ForEachAsync principalmente del blog de Stephen Toub, blogs.msdn.microsoft.com/pfxteam/2012/03/05/… . Luego, si lanzo una excepción dentro de una, de await enumerable.ForEachAsync( async () => { throw new ApplicationException( "Test" ); } );alguna manera, se 'cambia' a una TaskCanceledException. ¿Alguna idea de cómo podría ser eso? Este es un problema para mí, ya que quiero capturar una OperationCanceledException 'verdadera' a través de catch (OperationCanceledException) pero no quiero que se capture esta TaskCanceledException (que realmente debería ser ApplicationException).
Terry