Qual é a diferença entre Task.WaitAll()
e Task.WhenAll()
do CTP assíncrono? Você pode fornecer algum código de exemplo para ilustrar os diferentes casos de uso?
c#
asynchronous
async-await
task-parallel-library
Yaron Levi
fonte
fonte
WhenAll
, mas isso não é o mesmo que bloquear o encadeamento.Enquanto a resposta de JonSkeet explica a diferença de uma maneira tipicamente excelente, há outra diferença: tratamento de exceções .
Task.WaitAll
lança umAggregateException
quando qualquer uma das tarefas é lançada e você pode examinar todas as exceções lançadas. Oawait
inawait Task.WhenAll
desembrulha oAggregateException
e 'retorna' apenas a primeira exceção.Quando o programa abaixo é executado com
await Task.WhenAll(taskArray)
a saída é o seguinte.Quando o programa abaixo é executado com
Task.WaitAll(taskArray)
a saída é o seguinte.O programa:
fonte
await t1; await t2; await t3;
vsawait Task.WhenAll(t1,t2,t3);
await
, não uma diferença entre os dois métodos. Ambos propagam umAggregateException
, jogando diretamente ou através de uma propriedade (aTask.Exception
propriedade).Como exemplo da diferença - se você tem uma tarefa, faz algo com o thread da interface do usuário (por exemplo, uma tarefa que representa uma animação em um Storyboard) se você
Task.WaitAll()
o thread da interface do usuário é bloqueado e a interface do usuário nunca é atualizada. se você usarawait Task.WhenAll()
, o thread da interface do usuário não será bloqueado e a interface do usuário será atualizada.fonte
O que eles fazem:
Qual é a diferença:
Use qual quando:
fonte
WaitAll
que eu entendo.Task.WaitAll
depois de fazer algum outro trabalho? Quero dizer, em vez de chamá-lo logo após iniciar suas tarefas.