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 de await 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
InformationsquelleAutor clausndk | 2013-02-28