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 toute la liste des pages Web souhaitées.
Existe-t-il un moyen de limiter le nombre de threads ou toute autre limite lors de l'exécution de Parallel.ForEach ?
Code démo :
Parallel.ForEach(listOfWebpages, webpage => {
Download(webpage);
});
La tâche réelle n'a rien à voir avec les pages web, c'est pourquoi les solutions créatives d'exploration du web ne seront d'aucune utilité.
0 votes
@jKlaus Si la liste n'est pas modifiée, c'est-à-dire s'il s'agit simplement d'un ensemble d'URL, je ne vois pas vraiment le problème ?
0 votes
@Shiv, avec un peu de temps, vous... Comptez votre nombre d'exécutions et comparez-le à celui de la liste.
0 votes
@jKlaus Selon vous, qu'est-ce qui va mal se passer ?
0 votes
@Shiv, exécutez ceci plusieurs fois dotnetfiddle.net/maKiI5
1 votes
@jKlaus vous modifiez un élément non threadsafe (l'entier). Je m'attendrais à ce que cela ne fonctionne pas dans ce scénario. L'OP, quant à lui, ne modifie rien qui ait besoin d'être threadsafe.
0 votes
@Shiv, Es-tu positif ? Je n'ai pas vu le code source de Download().
0 votes
@jKlaus Oui Download() n'a pas de référence à listOfWebpages
2 votes
@jKlaus Voici un exemple de Parallel.ForEach qui définit le compte correctement > dotnetfiddle.net/moqP2C . Lien MSDN : msdn.microsoft.com/en-us/library/dd997393(v=vs.110).aspx
0 votes
@jKlaus - donc... vous devriez supprimer vos commentaires / toute cette chaîne est trompeuse... ce que vous avez initialement souligné n'est pas en fait un problème avec le code ci-dessus, puisqu'il passe l'unique élément de la boucle en cours à la méthode. Il n'y a pas de partage de variables entre les threads/exécutions de la boucle.
0 votes
Parallel.ForEach
n'est pas adapté à la limitation des opérations d'E/S. Consultez cette question pour obtenir des solutions appropriées : Comment limiter le nombre d'opérations d'E/S asynchrones simultanées ?