Estoy trabajando en un Web Hook en .NET 4.0 que ejecutará una lambda de forma asíncrona y luego publicará el resultado en un URI dado cuando está terminado.Quiero que la tarea maneje las excepciones que se lanzan, pero me es difícil evitar que lleguen a la matriz
Tengo que funcionar, pero ahora quiero que la Tarea maneje las excepciones que se lanzan, y me resulta difícil evitar que lleguen a la matriz.
Aquí es parte de mi código:
private readonly Func<T> _startTask;
private readonly string _responseUri;
public Task<T> Begin()
{
var task = new Task<T>(_startTask);
task.ContinueWith<T>(End);
task.Start();
return task;
}
private T End(Task<T> task)
{
if (task.IsFaulted)
{
return HandleException(task);
}
var result = task.Result;
WebHookResponse.Respond(result, _responseUri);
return result;
}
private T HandleException(Task<T> task)
{
WebHookResponse.HandleException(task.Exception.InnerException, _responseUri);
return null;
}
Una versión alternativa que he tratado llamadas ContinueWith()
dos veces para registrar una continuidad para funcionar OnlyOnRanToCompletion
y uno para funcionar OnlyOnFaulted
. (No estoy seguro de si llama dos veces ContinueWith()
es correcta.):
public Task<T> Begin()
{
var task = new Task<T>(_startTask);
task.ContinueWith<T>(End, TaskContinuationOptions.OnlyOnRanToCompletion);
task.ContinueWith<T>(HandleException, TaskContinuationOptions.OnlyOnFaulted);
task.Start();
return task;
}
private T End(Task<T> task)
{
var result = task.Result;
WebHookResponse.Respond(result, _responseUri);
return result;
}
private T HandleException(Task<T> task)
{
WebHookResponse.HandleException(task.Exception.InnerException, _responseUri);
return null;
}
Así que básicamente buscan una forma para cada tarea manejar sus propias excepciones a través de una función de continuación. Tal como está, la función de continuación HandlException nunca se llama en ninguno de los ejemplos anteriores.
Estoy causando las excepciones en un caso de prueba, y debo mencionar que estoy usando una llamada Tasks.WaitAll(tasks);
en una serie de tareas para asegurarme de que todas las tareas estén completas antes de hacer mis afirmaciones, y no estoy seguro si esa llamada hace una diferencia en cómo las Tareas manejan las excepciones. Actualmente, WaitAll arroja una AggregationException que agrega las excepciones para cada una de las Tareas porque no están siendo manejadas por la función de continuación HandleException.
No veo el problema. ¿Qué comportamiento estás viendo? –
Lo sentimos, no se está llamando a la función de continuación HandleException. Las Tasks.WaitAll (tareas) generan una AggregationException; llamada. No quiero ver una AggregationException. Acabo de actualizar la pregunta. –
@Martin Owen Hola, mi HandleExceptionContinuation tampoco se llama y mi evento UnobservedTaskException tampoco se activará aquí: http://stackoverflow.com/questions/11831844/unobservedtaskexception-being-throw-but-it-is-handled-by- a-taskscheduler-unbser ¿encontraste alguna solución? – newway