Todos, hay muchas preguntas sobre el tema anterior, pero creo que esto es lo suficientemente diferente como para justificar una nueva pregunta. Tengo el siguiente Task
y una continuación para tratar con una variedad de tareas Status
; TaskStatus.RanToCompletion
, TaskStatus.Canceled
y, por supuesto, AggregateException
a través de TaskStatus.Faulted
. El código es el siguienteTPL y Exception Handling
Task<bool> asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, token, someBoolean), token);
asyncTask.ContinueWith(task =>
{
// Check task status.
switch (task.Status)
{
// Handle any exceptions to prevent UnobservedTaskException.
case TaskStatus.RanToCompletion:
if (asyncTask.Result)
{
// Do stuff...
}
break;
case TaskStatus.Faulted:
if (task.Exception != null)
mainForm.progressRightLabelText = task.Exception.InnerException.Message;
else
mainForm.progressRightLabelText = "Operation failed!";
default:
break;
}
}
Todo esto funciona bien, pero me preocupa si estoy o no estoy haciendo bien, ya que existe la posibilidad de una AggregateException
ser arrojado desde el interior de la continuación - ¿entonces qué?
No quiero Wait
en mi asyncTask
ni la continuación ya que esto bloqueará el retorno al subproceso UI. Para la captura de excepciones emitidas desde dentro de una continuación no se puede decir que tengo que hacer algo como esto seguramente
Task parentTask = Task.Factory.startNew(() =>
{
Task<bool> asyncTask = Task.Factory.StartNew<bool>(() =>
asyncMethod(uiScheduler, token, someBoolean), token);
Task continueTask = asyncTask.ContinueWith(task =>
{
// My continuation stuff...
}
try
{
continueTask.Wait();
}
catch(AggregateException aggEx)
{
// Some handling here...
}
});
sería esto incluso trabajar? ¿Cuál es la mejor práctica aquí?
Como siempre, gracias por su tiempo.
He visto tareas que "se ejecutaron por completo" cuando en realidad arrojaron una AggregateException. Ese tipo de manejo de errores no funciona. ¿Por qué no usar un try/catch? –
¿Quiere decir en el método que se llama en el hilo de fondo, o en el método de delegado de continuación real? – MoonKnight