Veo dos opciones que se pueden utilizar con el propósito de centralizar el manejo de excepciones en TPL: 1. Uso de excepción de tarea no observada evento del Programador de tareas. 2. Uso de continuaciones para tareas con estado en falla.
Uso del evento de excepción de tarea no observada del Programador de tareas.
El planificador de tareas tiene un evento UnobservedTaskException al que puede suscribirse mediante el operador + =.
- Nota 1: En el cuerpo del controlador que necesita para hacer llamadas SetObserved() el argumento UnobservedTaskExceptionEventArgs para notificar planificador que se manejó excepción.
- Nota 2: Se llama al controlador cuando el recolector de basura ha recopilado las tareas.
- Nota 3: Si espera en la tarea, se verá obligado a proteger la espera en el bloque de prueba/captura.
- Nota 4: La política predeterminada para excepciones de tareas no controladas en .Net 4.0 y 4.5 es diferente.
Resumen: Este enfoque es bueno para tareas de "olvídate del fuego" y para detectar excepciones escapadas de tu política centralizada de manejo de excepciones.
Uso de continuaciones para tareas con estado en fallo.
Con TPL puede adjuntar acciones a la tarea mediante el método ContinueWith() que toma la acción de adjuntar y la opción de continuación. Se llamará a esta acción después de la terminación de la tarea y solo en los casos especificados por opción. En particular:
t.ContinueWith(c => { /* exception handling code */ }, TaskContinuationOptions.OnlyOnFaulted);
instala continuación con el código de control de excepciones a la tarea t. Este código se ejecutará solo en el caso cuando finalizó la Tarea t debido a la excepción no controlada.
- Nota 1: Obtenga el valor de excepción en el código de excepción. De lo contrario, se borrará.
- Nota 2: Se llamará al código de manejo de excepciones inmediatamente después de la finalización de la tarea.
- Nota 3: Si la excepción se obtuvo en el código de manejo de excepciones, se considerará como manejada, el bloque try/catch en la tarea en espera no podrá detectarlo.
Creo que será mejor para el manejo de excepciones centralizado utilizar Tareas personalizadas heredadas de Tarea con el controlador de excepciones agregado a través de la continuación. Y acompañe este enfoque utilizando el evento Excepción de tarea no observada del Programador de tareas para detectar intentos de utilizar tareas no personalizadas.
La solución actualizada funciona muy bien por lo que yo sé. ¿Por qué tan poca gente tiene este problema? –
Sería muy amable de su parte si pudiera incluir el código de su blog aquí también. – Nifle
@Buu Nguyen Hola, hice algo basado en su enfoque aquí: http://stackoverflow.com/questions/11831844/unobservedtaskexception-being-throw-but-it-is-handled-by-a-taskscheduler-unobser/11908212 # 11908212 Muchas gracias. Esperando que C# tenga algo mejor. – newway