En parallèle foreach avec asynchrone lambda
Je voudrais gérer une collection en parallèle, mais je vais avoir de la difficulté à le mettre en œuvre et je suis donc en espérant de l'aide.
Le problème se pose de savoir si je veux appeler une méthode marquée async en C#, dans le lambda de la boucle parallèle. Par exemple:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
//some pre stuff
var response = await GetData(item);
bag.Add(response);
//some post stuff
}
var count = bag.Count;
Le problème se produit avec le comte de 0, parce que tous les threads créés sont effectivement juste threads d'arrière-plan et la Parallel.ForEach
d'appel de ne pas attendre la fin. Si je supprime le mot-clé async, la méthode ressemble à ceci:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
//some pre stuff
var responseTask = await GetData(item);
responseTask.Wait();
var response = responseTask.Result;
bag.Add(response);
//some post stuff
}
var count = bag.Count;
Il fonctionne, mais il désactive complètement l'attendent à l'astuce et je dois faire quelques manuel de gestion des exceptions.. (Supprimé par souci de concision).
Comment puis-je mettre en œuvre un Parallel.ForEach
boucle, qui utilise le mot clé await dans le lambda? Est-il possible?
Le prototype de la Parallèle.ForEach méthode prend un Action<T>
comme paramètre, mais je veux attendre que mon asynchrone lambda.
- Je suppose que vous vouliez supprimer
await
deawait GetData(item)
dans votre deuxième bloc de code comme il produirait une erreur de compilation comme-est. - Double Possible de Nidification attendent en Parallèle.ForEach
Vous devez vous connecter pour publier un commentaire.
Si vous voulez juste simple parallélisme, vous pouvez le faire:
Si vous avez besoin de quelque chose de plus complexe, découvrez Stephen Toub est
ForEachAsync
post.dop
tâches et chacun d'eux traite ensuite des sous-ensembles de la collection d'entrée dans la série.Task.Run
sansawait
ing le résultat, alors que juste jetant le feu et oublier le travail sur le pool de threads. C'est presque toujours une erreur.Vous pouvez utiliser le
ParallelForEachAsync
méthode d'extension de AsyncEnumerator Package NuGet:maxDegreeOfParallelism
>maxDegreeOfParalellism
J'ai créé une méthode d'extension pour ce qui rend l'utilisation de SemaphoreSlim et permet également de définir le degré maximal de parallélisme
Exemple D'Utilisation:
Mon léger de la mise en œuvre de ParallelForEach async.
Caractéristiques:
Exemple d'utilisation: