web-dev-qa-db-fra.com

Comment puis-je limiter Parallel.ForEach?

J'ai une boucle asynchrone Parallel.ForEach () avec laquelle je télécharge des pages Web. Ma bande passante étant limitée, je ne peux télécharger que x pages à la fois, mais Parallel.ForEach exécute la liste complète des pages Web souhaitées.

Est-il possible de limiter le nombre de threads ou tout autre limiteur lors de l'exécution de Parallel.ForEach?

Code de démonstration:

Parallel.ForEach(listOfWebpages, webpage => {
  Download(webpage);
});

La vraie tâche n’a rien à voir avec les pages Web. Par conséquent, les solutions d’exploration Web créatives n’aideront pas.

269
eugeneK

Vous pouvez spécifier un MaxDegreeOfParallelism dans un paramètre ParallelOptions:

Parallel.ForEach(
    listOfWebpages,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    webpage => { Download(webpage); }
);

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

516
Nicholas Butler

Vous pouvez utiliser ParallelOptions et définir MaxDegreeOfParallelism pour limiter le nombre de threads simultanés:

Parallel.ForEach(listOfwebpages, new ParallelOptions{MaxDegreeOfParallelism=2}, webpage => {Download(webpage);});     
38
rikitikitik

Utilisez une autre surcharge de Parallel.Foreach prenant une instance ParallelOptions et définissez MaxDegreeOfParallelism pour limiter le nombre d'instances exécutées en parallèle.

21
Richard

Et pour les utilisateurs de VB.net (la syntaxe est étrange et difficile à trouver) ...

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage)
......end sub)  
11
user3496060