c# Threadpool - limiter le nombre de threads
Je développe une application console.
Je veux utiliser un pool de threads pour effectuer des téléchargements sur le web. Voici quelques faux code.
for (int loop=0; loop< 100; loop++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(GetPage), pageList[loop]);
}
snip
private static void GetPage(object o)
{
//get the page
}
Comment puis-je empêcher mon code de départ de plus de deux (ou dix, ou quoi que ce soit) threads simultanés?
J'ai essayé
ThreadPool.SetMaxThreads(1, 0);
ThreadPool.SetMinThreads(1, 0);
Mais ils semblent n'avoir aucune incidence.
OriginalL'auteur Bryan | 2012-04-26
Vous devez vous connecter pour publier un commentaire.
Je voudrais utiliser
Parallel.For
et définirMaxDegreeOfParallelism
en conséquence.OriginalL'auteur
Juste à l'inverse de ce code à partir de:
:
Vous ne pouvez pas définir la MaxThread plus petit que MinThread
bon! les travaux de cette.
OriginalL'auteur
Personnellement, je voudrais utiliser SmartThreadPool et de laisser le pool de threads seul. Cependant, c'est probablement ce que vous voulez: C# pool de threads de limiter les threads
Inclus code de lien (merci de donner à l'auteur original de crédit, pas moi)
OriginalL'auteur
Description
Vous pouvez faire cela en utilisant la
ThreadPool.SetMaxThreads
méthode.Mais il y a certains problèmes avec le pool de threads pour WebRequest.
Lire, par exemple, ce (Bug dans le pool de threads ou HttpWebRequest?)
Échantillon
Modifier
Personnellement, je utiliser AsParallel de
Linq
, pour cette.Plus D'Informations
Pour info... ce qui limite le nombre total de threads dans IIS pool de threads, donc, fondamentalement, les utilisateurs ne seront pas en mesure d'accéder à votre site. Ce code doit vivre sur un autre site web avec son propre pool de threads.
Ajout de détails à la question
Ma réponse est mise à jour.
OriginalL'auteur
Regarder les paramètres de pool de threads.SetMaxThreads. Le premier paramètre est le montant de threads de travail et le deuxième paramètre est le montant de la async fils, qui est celui qui vous parle.
Plus bas dans la documentation, il est dit:
Il semble que vous essayez d'utiliser le pool de threads pour quelque chose, il n'est pas destiné à être utilisé pour. Si vous souhaitez limiter la quantité de téléchargements de créer une classe qui s'occupe de ça pour vous, parce que le pool de threads n'est pas nécessairement la solution à votre problème.
Je vous suggère une classe qui lance deux threads du pool de threads et attend pour le rappel. Lorsqu'il reçoit un rappel pour la réalisation de l'un des threads en attente d'un nouveau.
OriginalL'auteur
Si vous êtes à la serrer .Net 2.0, vous pouvez utiliser la technique suivante:
savoir le fait que la whey vous mettre en file d'attente d'une tâche à l'
ThreadPool
il va créer un nouveau fil de discussion (bien sûr, si il n'y a pas ceux qui sont gratuits), vous devrez attendre avant de le faire jusqu'à ce qu'il y a un thread libre. Pour cette raison, laBlockingCounter
classe est utilisée (décrit ci-dessous) qu'une fois la limite atteinte, il va attendre pour incrémenter jusqu'à ce que quelqu'un (un autre thread) décrémente. Puis il est entré "fermé" état indiquant qu'aucune nouvelle Incréments sera fait et attend l'achèvement.Ci-dessous est l'exemple qui montre un maximum de 4 tâches avec le nombre total de 10.
Il utilise le BlockingCounter classe qui est basée sur le Marc Gravel est SizeQueue posté ici, mais sans comptoir au lieu d'une file d'attente. Lors de la fin des files d'attente des nouveaux threads appeler la méthode Close (), puis attendez la fin de la.
Le résultat sera comme ça:
OriginalL'auteur