¿Cuál es la diferencia entre Task.WaitAll()
y Task.WhenAll()
desde el Async CTP? ¿Puede proporcionar algún código de muestra para ilustrar los diferentes casos de uso?
c#
asynchronous
async-await
task-parallel-library
Yaron Levi
fuente
fuente
WhenAll
, pero eso no es lo mismo que bloquear el hilo.Si bien la respuesta de JonSkeet explica la diferencia de una manera típicamente excelente, hay otra diferencia: el manejo de excepciones .
Task.WaitAll
lanza unAggregateException
cuando se lanza cualquiera de las tareas y puede examinar todas las excepciones lanzadas. Elawait
enawait Task.WhenAll
desenvuelve losAggregateException
y 'devuelve' sólo la primera excepción.Cuando el siguiente programa se ejecuta con
await Task.WhenAll(taskArray)
la salida es el siguiente.Cuando el siguiente programa se ejecuta con
Task.WaitAll(taskArray)
la salida es la siguiente.El programa:
fuente
await t1; await t2; await t3;
vsawait Task.WhenAll(t1,t2,t3);
await
, no una diferencia entre los dos métodos. Ambos propagan unAggregateException
, lanzando directamente o a través de una propiedad (laTask.Exception
propiedad).Como ejemplo de la diferencia: si tiene una tarea, hace algo con el hilo de la interfaz de usuario (por ejemplo, una tarea que representa una animación en un guión gráfico) si
Task.WaitAll()
luego el hilo de la interfaz de usuario está bloqueado y la interfaz de usuario nunca se actualiza. si lo usaawait Task.WhenAll()
, el hilo de la interfaz de usuario no está bloqueado y la interfaz de usuario se actualizará.fuente
Qué hacen:
Cual es la diferencia:
Use cual cuando:
fuente
WaitAll
que yo entiendo.Task.WaitAll
después de que hiciste tu otro trabajo? Quiero decir, en lugar de llamarlo justo después de comenzar tus tareas.