c# - parallel - Lanzar excepción dentro de una tarea: "esperar" frente a esperar()
tpl task parallel library (2)
static async void Main(string[] args)
{
Task t = new Task(() => { throw new Exception(); });
try
{
t.Start();
t.Wait();
}
catch (AggregateException e)
{
// When waiting on the task, an AggregateException is thrown.
}
try
{
t.Start();
await t;
}
catch (Exception e)
{
// When awating on the task, the exception itself is thrown.
// in this case a regular Exception.
}
}
En TPL, cuando se lanza una excepción dentro de una tarea, se envuelve con una excepción AggregateException.
Pero no ocurre lo mismo cuando se usa la palabra clave await .
¿Cuál es la explicación de ese comportamiento?
El objetivo es hacer que se vea / actúe como la versión síncrona. Jon Skeet hace un gran trabajo explicando esto en su serie Eduasync, específicamente este post:
En TPL, se utiliza la excepción AggregateException
porque puede tener varias tareas en espera (la tarea puede tener tareas secundarias adjuntas), por lo que muchas de ellas pueden generar excepciones. Mira las excepciones en la sección de tareas infantiles.
https://msdn.microsoft.com/ru-ru/library/dd997417(v=vs.110).aspx
En await
siempre tienes una sola tarea.
Consulte también https://msdn.microsoft.com/ru-ru/library/dd997415(v=vs.110).aspx