c# - Parallel.ForEach vs Task.Run et Task.WhenAll




2 Answers

Dans ce cas, la seconde méthode attendra de manière asynchrone que les tâches se terminent au lieu de bloquer.

Cependant, il y a un inconvénient à utiliser Task.Run dans une Task.Run Avec Parallel.ForEach , il y a un Partitioner qui est créé pour éviter de faire plus de tâches que nécessaire. Task.Run effectuera toujours une seule tâche par élément (puisque vous le faites), mais les lots de la classe Parallel fonctionnent de sorte que vous créez moins de tâches que le nombre total d'éléments de travail. Cela peut fournir des performances globales significativement meilleures, en particulier si le corps de la boucle a une petite quantité de travail par élément.

Si c'est le cas, vous pouvez combiner les deux options en écrivant:

await Task.Run(() => Parallel.ForEach(strings, s =>
{
    DoSomething(s);
}));

Notez que ceci peut également être écrit sous cette forme plus courte:

await Task.Run(() => Parallel.ForEach(strings, DoSomething));

Quelles sont les différences entre utiliser Parallel.ForEach ou Task.Run () pour démarrer un ensemble de tâches de manière asynchrone?

Version 1:

List<string> strings = new List<string> { "s1", "s2", "s3" };
Parallel.ForEach(strings, s =>
{
    DoSomething(s);
});

Version 2:

List<string> strings = new List<string> { "s1", "s2", "s3" };
List<Task> Tasks = new List<Task>();
foreach (var s in strings)
{
    Tasks.Add(Task.Run(() => DoSomething(s)));
}
await Task.WhenAll(Tasks);



J'ai fini par faire cela, car il me semblait plus facile à lire:

  List<Task> x = new List<Task>();
  foreach(var s in myCollectionOfObject)
  {
      // Note there is no await here. Just collection the Tasks
      x.Add(s.DoSomethingAsync());
  }
  await Task.WhenAll(x);



Related

c# async-await parallel.foreach