J'ai une boucle asynchrone Parallel.ForEach () avec laquelle je télécharge des pages Web. Ma bande passante est limitée, je ne peux donc télécharger que x pages à la fois, mais Parallel.ForEach exécute toute la liste des pages Web souhaitées.
Existe-t-il un moyen 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, donc les solutions créatives d'exploration de sites Web n'aideront pas.
c#
.net
asynchronous
parallel.foreach
eugeneK
la source
la source
Réponses:
Vous pouvez spécifier un
MaxDegreeOfParallelism
dans unParallelOptions
paramètre:MSDN: Parallel.ForEach
MSDN: ParallelOptions.MaxDegreeOfParallelism
la source
var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0)) };
-1
revient à ne pas le spécifier du tout: "Si [la valeur] est -1, il n'y a pas de limite sur le nombre d'opérations exécutées simultanément"var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 2.0)) };
. Lien vers les fils vs les cœurs - askubuntu.com/questions/668538/…Vous pouvez utiliser ParallelOptions et définir MaxDegreeOfParallelism pour limiter le nombre de threads simultanés:
la source
Utilisez une autre surcharge
Parallel.Foreach
qui prend uneParallelOptions
instance et définissez-laMaxDegreeOfParallelism
pour limiter le nombre d'instances exécutées en parallèle.la source
Et pour les utilisateurs de VB.net (la syntaxe est bizarre et difficile à trouver) ...
la source