meilleure utilisation de la Parallèle.ForEach / Multithreading

J'ai besoin de recueillir des données à partir d'un site web.
J'ai plus de 1000 liens que j'ai besoin d'accéder à, et auparavant, j'étais en divisant les liens 10 par thread, et commencerait 100 fils de chaque tirant 10. Après quelques cas de test, 100 fils a été la meilleure valeur pour minimiser le temps qu'il extrait le contenu de tous les liens.

J'ai réalisé que .NET 4.0 offert un meilleur support pour le multi-threading hors de la boîte, mais cela est fait en fonction du nombre de coeurs que vous avez, ce qui dans mon cas ne fraient pas assez de threads. Je suppose que ce que je pose est: quelle est la meilleure façon d'optimiser les 1000 lien tirant. Dois-je utiliser .ForEach et de laisser le Parallel le contrôle de l'extension de la quantité de threads qui se donné lieu, ou trouver un moyen de dire le nombre de threads de début et de répartir le travail?

Je n'ai pas travaillé avec Parallel avant, donc peut-être que mon approche peut-être tort.

Tirant les liens du web n'est pas un CPU, de la tâche, de sorte que l'ajout de beaucoup de threads ne sera probablement pas vous aider beaucoup. En outre, le frai 100 threads est une mauvaise idée sur la plupart des matériels actuels. Jetez un oeil à async pour cela.
Fortement d'e / s réseau des tâches limitées, qui n'est pas nécessairement vrai. Aussi longtemps que le pool de threads n'est pas épuisé, permettant à plusieurs demandes simultanées est probablement une bonne chose. Si vous avez 100 threads et un temps de réponse de 1 seconde, c'est seulement à plus de 100 changements de contexte par seconde sur un seul système de base, ou 25 sur un quad core. Bien sûr, ce sont toutes des suppositions numéros, mais on dirait que l'OP a essayé une variété de paramètres et se sont installés sur ces être le mieux pour son cas d'utilisation et le matériel.
C'est pourquoi je dis "probablement". De toute façon, j'allais encore avec un async solution avant de tourner jusqu'à 100 threads.
Async serait une très bonne alternative. Peut-être ajouter une autre réponse?
Ouais, mais si vous n'avez pas de soins sur la perte de 100 MO de mémoire et vous ne pouvez pas utiliser le C# 5.0, puis la création de 100 threads est beaucoup mieux que de le faire de manière asynchrone.

OriginalL'auteur Zoinky | 2013-02-08