Quelle est la différence entre Task.WaitAll()
et Task.WhenAll()
depuis le CTP Async? Pouvez-vous fournir un exemple de code pour illustrer les différents cas d'utilisation?
c#
asynchronous
async-await
task-parallel-library
Yaron Levi
la source
la source
WhenAll
, mais ce n'est pas la même chose que de bloquer le thread.Alors que la réponse de JonSkeet explique la différence d'une manière généralement excellente, il existe une autre différence: la gestion des exceptions .
Task.WaitAll
jette unAggregateException
lorsque l'une des tâches est lancée et vous pouvez examiner toutes les exceptions levées. Leawait
inawait Task.WhenAll
déballe leAggregateException
et ne 'retourne' que la première exception.Lorsque le programme ci-dessous s'exécute avec
await Task.WhenAll(taskArray)
la sortie est la suivante.Lorsque le programme ci-dessous est exécuté avec
Task.WaitAll(taskArray)
la sortie est la suivante.Le programme:
la source
await t1; await t2; await t3;
vsawait Task.WhenAll(t1,t2,t3);
await
, pas une différence entre les deux méthodes. Les deux propagent unAggregateException
, en lançant directement ou via une propriété (laTask.Exception
propriété).Comme exemple de différence - si vous avez une tâche, elle fait quelque chose avec le thread d'interface utilisateur (par exemple, une tâche qui représente une animation dans un Storyboard) si vous
Task.WaitAll()
le thread d'interface utilisateur est alors bloqué et l'interface utilisateur n'est jamais mise à jour. si vous utilisez,await Task.WhenAll()
le thread d'interface utilisateur n'est pas bloqué et l'interface utilisateur sera mise à jour.la source
Que font-ils:
Quelle est la différence:
À utiliser lorsque:
la source
WaitAll
que je comprends.Task.WaitAll
avoir fait votre autre travail? Je veux dire, au lieu de l'appeler juste après avoir commencé vos tâches.