plusieurs attend vs Tâche.WaitAll équivalent?
En termes de performances, ces 2 méthodes exécuter GetAllWidgets()
et GetAllFoos()
en parallèle?
Est-il une raison pour utiliser l'un plutôt que l'autre? Il semble y avoir beaucoup qui se passe derrière les coulisses avec le compilateur, donc je ne trouve pas ça clair.
============= MethodA: l'Utilisation de plusieurs attend ======================
public async Task<IHttpActionResult> MethodA()
{
var customer = new Customer();
customer.Widgets = await _widgetService.GetAllWidgets();
customer.Foos = await _fooService.GetAllFoos();
return Ok(customer);
}
=============== MethodB: À L'Aide De La Tâche.WaitAll =====================
public async Task<IHttpActionResult> MethodB()
{
var customer = new Customer();
var getAllWidgetsTask = _widgetService.GetAllWidgets();
var getAllFoosTask = _fooService.GetAllFos();
Task.WaitAll(new List[] {getAllWidgetsTask, getAllFoosTask});
customer.Widgets = getAllWidgetsTask.Result;
customer.Foos = getAllFoosTask.Result;
return Ok(customer);
}
=====================================
- Dans ton premier exemple, les deux méthodes seront appelés séquentiellement et dans la seconde, ils vont être exécutés en parallèle, de sorte qu'ils ne sont pas équivalents. Aussi, dans votre deuxième méthode de blocage lors de l'exécution de ces tâches.
- MethodA exécutera
_fooService.GetAllFoos()
uniquement lorsque_widgetService.GetAllWidgets()
a fini, methodB va l'exécuter lorsque la Tâche inachevée de_fooService.GetAllFoos()
retourne.
Vous devez vous connecter pour publier un commentaire.
La première option de ne pas exécuter les deux opérations simultanément. Il exécutera la première et attendre son achèvement, et seulement ensuite la deuxième.
La seconde option est d'exécuter les deux en même temps mais va attendre pour eux de façon synchrone (c'est à dire tout en bloquant un thread).
Vous ne devez pas utiliser deux options depuis la première est terminée plus lent que le second, et le second bloque un fil sans le besoin.
Vous devez attendre pour les deux opérations de manière asynchrone avec
Task.WhenAll
:Noter qu'après
Task.WhenAll
rempli les deux tâches déjà achevés à ce qui les attend s'effectue immédiatement.await Task.WhenAll(getAllWidgetsTask, getAllFoosTask);
et juste attendre tâches (juste le début de la deuxième tâche en attente du premier).await
?await
ne se soucie pas de savoir si la tâche est terminée ou non (même optimise si elle est).Result
encapsule toutes les exceptions dans unAggregateException
, que vous devez ensuite déballer dans tous de votre code de gestion d'erreur.await
déballe pour vous. Autre que cela, elles sont identiques.Réponse courte: Non.
Task.WaitAll
est le blocage,await
revient la tâche dès qu'il se produit et enregistre la partie restante de la fonction et de la poursuite."L'essentiel" en attente de la méthode que vous cherchiez est
Task.WhenAll
qui crée en fait une nouvelleTask
qui se termine lorsque toutes les tâches qui ont été remis à la fonction de faire.Comme suit:
await Task.WhenAll({getAllWidgetsTask, getAllFoosTask});
Qui est pour le blocage de la matière.
Également votre première fonction ne pas exécuter les deux fonctions en parallèle. Pour obtenir ce travail avec
await
vous devriez écrire quelque chose comme ceci:Cela rendra le premier exemple de loi très similaire à la
Task.WhenAll
méthode.Seulement votre deuxième option exécuter en parallèle. Votre première attendent sur chaque appel dans l'ordre.
Dès que vous lancez la méthode asynchrone, il va commencer l'exécution. Si elle va à l'exécution du thread courant (et donc exécuté de manière synchrone) ou il se déroulera asynchrone n'est pas possible de déterminer.
Ainsi, dans votre premier exemple, la première méthode consiste à commencer à travailler, mais alors vous artificiellement arrête l'écoulement du code avec les attendent. Et donc la deuxième méthode ne sera pas invoquée avant la première est effectuée en cours d'exécution.
Le deuxième exemple évoque à la fois les méthodes sans arrêter l'écoulement avec un attendent. Ainsi, ils seront susceptibles de s'exécuter en parallèle si les méthodes sont asynchrones.