He leído mucho sobre cómo manejar excepciones en TPL pero realmente no entiendo.manejo de excepción en Tpl
Permite tomar este código de ejemplo:
var task1 = new Task(() => { throw new Exception("Throw 1"); });
var task2 = task1.ContinueWith(t => Console.WriteLine("Catch 1:{0}", t.Exception.Message),
TaskContinuationOptions.OnlyOnFaulted);
var task3 = task2.ContinueWith(t => Console.WriteLine("Continuation"));
task1.Start();
try {
task1.Wait();
}
catch (Exception ex) {
Console.WriteLine("Wait Exception: {0}", ex.Message);
}
esperaba que esto imprime
Catch 1
Continuation
pero me da
Catch 1
Continuation
Wait Exception
Esto significa que la excepción todavía se considera controlada cuando el la tarea finaliza y el finalizador de la tarea acabará derribando la aplicación.
¿Cómo manejo la excepción dentro de la continuación para que el finalizador no se lance? Al mismo tiempo, quiero que la tarea permanezca en estado de error, por lo que no será posible ajustar la tarea en try/catch.
El fondo es que quiero implementar el patrón evento asíncrono como se especifica here pero con el tratamiento de errores. Mi código completo es el siguiente
public IAsyncResult Begin(AsyncCallback callback, object state, Action action) {
var task1 = new Task(action);
var task2 = task1.ContinueWith(t => HandleException(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
if (callback != null) {
var task3 = task2.ContinueWith(t => callback(t),
TaskScheduler.FromCurrentSynchronizationContext());
var task4 = task3.ContinueWith(t => HandleException(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
}
task1.Start();
return task;
}
Pensé en llamar 't.Wait()' en un intento en la continuación e ignorando la excepción. Pero eso no funcionará, porque la continuación se puede ejecutar después de los otros lanzamientos 'Wait()'. – svick