J'ai des problèmes avec le ThreadPool de .NET (.NET 4).
J'ai lu que par défaut .NET a une limite de 25 threads par processeur, mais selon les messages du forum sur SO et ailleurs, je peux augmenter la limite avec le code ci-dessous.
void SetThreads(int threads)
{
ThreadPool.SetMaxThreads(threads, threads);
ThreadPool.SetMinThreads(threads, threads);
}
Cependant, lorsque j'ai défini ce qui précède sur un nombre arbitrairement élevé, par exemple, 2000, et que j'ai mis en file d'attente ~ 1000 éléments, je n'ai toujours que ~ 33 threads en cours d'exécution (.NET CLR prend ~ 5 threads), et ThreadPool.GetAvailableThreads()
renvoie 1971 threads restants.
Pourquoi le code ci-dessus ne fonctionne-t-il pas?
Lorsque la demande est faible, le nombre réel de threads du pool de threads peut tomber en dessous des valeurs minimales.
Lisez aussi ceci: Patterns for Parallel Programming: Understanding and Application Parallel Patterns with the .NET Framework 4
Premièrement, votre "connaissance" des valeurs par défaut est incorrecte. La limite de 25 threads par processeur était de retour à partir de .NET 1.1. Il a été augmenté dans .NET 2, et maintenant :
À partir de .NET Framework version 4, la taille par défaut du pool de threads pour un processus dépend de plusieurs facteurs, tels que la taille de l'espace d'adressage virtuel. Un processus peut appeler la méthode GetMaxThreads pour déterminer le nombre de threads.
Cependant, il y a autre chose en jeu: le pool de threads ne crée pas immédiatement de nouveaux threads dans toutes les situations. Afin de faire face à des rafales de petites tâches, il limite la rapidité avec laquelle il crée de nouveaux threads. IIRC, il créera un thread toutes les 0,5 secondes s'il y a des tâches en suspens, jusqu'au nombre maximum de threads. Je ne peux pas voir immédiatement ce chiffre, alors il pourrait bien changer. Je soupçonne fortement que c'est ce que vous voyez cependant. Essayez de mettre en file d'attente un grand nombre d'éléments, puis surveillez le nombre de threads au fil du temps.
Vérifiez d'abord ce lien , en particulier cette remarque:
Si le runtime de langage commun est hébergé, par exemple par Internet Information Services (IIS) ou SQL Server, l'hôte peut limiter ou empêcher les modifications de la taille du pool de threads.
Ensuite, vous devez vérifier la valeur de retour de la méthode ThreadPool.SetMaxThreads(threads, threads)
. Peut-être qu'il renvoie false
?