Bon... J'ai fait une recherche approfondie sur le site et j'ai lu de nombreux messages sur ce sujet. J'ai trouvé cette question : Code pour un pool de threads simple en C# particulièrement utile.
Cependant, comme cela semble toujours le cas, ce dont j'ai besoin varie légèrement.
J'ai examiné l'exemple MSDN et l'ai quelque peu adapté à mes besoins. L'exemple auquel je me réfère est ici : http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80,imprimante).aspx
Mon problème est le suivant. J'ai un ensemble de code assez simple qui charge une page web via la page d'accueil. HttpWebRequest
y WebResponse
et lit les résultats via un Stream
. Je lance cette méthode dans un fil de discussion car elle devra être exécutée plusieurs fois. La méthode elle-même est assez courte, mais le nombre de fois qu'elle doit être exécutée (avec des données variées à chaque fois) varie. Il peut aller de 1 à 200.
Tout ce que j'ai lu semble indiquer que ThreadPool
La classe est le principal candidat. C'est là que les choses se compliquent. Je pourrais avoir besoin de déclencher cette chose disons 100 fois, mais je ne peux avoir que 3 threads au maximum en fonctionnement (pour cette tâche particulière).
J'ai essayé de régler le MaxThreads
sur le ThreadPool
via :
ThreadPool.SetMaxThreads(3, 3);
Je ne suis pas entièrement convaincu que cette approche fonctionne. De plus, je ne veux pas perturber les autres sites web ou programmes fonctionnant sur le système sur lequel il sera exécuté. Donc, en limitant le nombre de threads sur le serveur de l ThreadPool
Comment puis-je être certain que cela concerne uniquement mon code et mes fils ?
L'exemple MSDN utilise l'approche du lecteur d'événements et appelle WaitHandle.WaitAll(doneEvents);
ce qui est la façon dont je fais ça.
Le cœur de ma question est donc le suivant : comment garantir ou spécifier un nombre maximum de threads pouvant être exécutés pour son code, tout en laissant le code continuer à exécuter d'autres threads au fur et à mesure que les précédents se terminent jusqu'à un point arbitraire ? Est-ce que je m'y prends de la bonne façon ?
Sincèrement,
Jason
Ok, j'ai ajouté une approche de sémaphore et j'ai complètement supprimé la ThreadPool
code. Cela semble assez simple. J'ai eu mes informations de : http://www.albahari.com/threading/part2.aspx
C'est cet exemple qui m'a montré comment faire :
[le texte ci-dessous est un copier/coller du site].
A Semaphore
avec une capacité de un est similaire à un Mutex
o lock
sauf que le Semaphore
n'a pas de "propriétaire" - il est agnostique. N'importe quel thread peut appeler Release
sur un Semaphore
tandis qu'avec Mutex
y lock
Si la ressource n'est pas disponible, seul le thread qui l'a obtenue peut la libérer.
Dans l'exemple suivant, dix threads exécutent une boucle avec une valeur de Sleep
déclaration au milieu. A Semaphore
s'assure que pas plus de trois threads peuvent exécuter cette Sleep
La déclaration est faite immédiatement :
class SemaphoreTest
{
static Semaphore s = new Semaphore(3, 3); // Available=3; Capacity=3
static void Main()
{
for (int i = 0; i < 10; i++)
new Thread(Go).Start();
}
static void Go()
{
while (true)
{
s.WaitOne();
Thread.Sleep(100); // Only 3 threads can get here at once
s.Release();
}
}
}