J'ai besoin d'exécuter plusieurs tâches asynchrones dans une application console et d'attendre qu'elles se terminent toutes avant de poursuivre le traitement.
Il y a beaucoup d'articles là-bas, mais je semble devenir plus confus à mesure que je lis. J'ai lu et compris les principes de base de la bibliothèque de tâches, mais il me manque clairement un lien quelque part.
Je comprends qu'il est possible d'enchaîner les tâches pour qu'elles commencent après la fin d'une autre (ce qui est à peu près le scénario de tous les articles que j'ai lus), mais je veux que toutes mes tâches s'exécutent en même temps, et je veux le savoir une fois ils sont tous terminés.
Quelle est la mise en œuvre la plus simple pour un scénario comme celui-ci?
la source
await Task.WhenAll(task1, task2);
?Task.WhenAll
ne démarre pas les tâches pour vous. Vous devez les fournir "à chaud", ce qui signifie déjà commencé.StartNew
rotation de nouvelles tâches a à voir avec l'attente asynchrone de toutes?Vous pouvez créer de nombreuses tâches comme:
la source
La meilleure option que j'ai vue est la méthode d'extension suivante:
Appelez ça comme ceci:
Ou avec un lambda asynchrone:
la source
Vous pouvez utiliser
WhenAll
ce qui retournera un fichier attenduTask
ouWaitAll
qui n'a pas de type de retour et bloquera l'exécution du code jusqu'àThread.Sleep
ce que toutes les tâches soient terminées, annulées ou en panne.Exemple
Si vous souhaitez exécuter les tâches dans un ordre pratique, vous pouvez vous inspirer de cette réponse.
la source
await
pour chaque opération et en même temps utiliserWaitAll
ouWhenAll
. Les tâches d'Task[]
initialisation ne devraient-elles pas être sansawait
?Voulez-vous enchaîner les
Task
s ou pouvez-vous les invoquer de manière parallèle?Pour enchaîner Faites
juste quelque chose comme
et n'oubliez pas de vérifier l'
Task
instance précédente dans chacuneContinueWith
car elle pourrait être défectueuse.Pour la manière parallèle
La méthode la plus simple que j'ai rencontrée:
Parallel.Invoke
sinon il y aTask.WaitAll
ou vous pouvez même utiliserWaitHandle
s pour faire un compte à rebours jusqu'à zéro actions (attendez, il y a une nouvelle classe:)CountdownEvent
, ou ...la source
Voici comment je le fais avec un tableau Func <> :
la source
Encore une autre réponse ... mais je me retrouve généralement dans un cas, quand j'ai besoin de charger des données simultanément et de les mettre en variables, comme:
la source
LoadCatsAsync()
et neLoadDogAsync()
sont que des appels de base de données, ils sont liés aux E / S.Task.Run()
est pour le travail lié au CPU; cela ajoute une surcharge supplémentaire inutile si tout ce que vous faites est d'attendre une réponse du serveur de base de données. La réponse acceptée par Yuval est la bonne façon pour le travail lié aux E / S.J'ai préparé un morceau de code pour vous montrer comment utiliser la tâche pour certains de ces scénarios.
la source