web-dev-qa-db-fra.com

Nombre maximal de threads dans une application .NET?

Quel est le nombre maximal de threads que vous pouvez créer dans une application C #? Et que se passe-t-il lorsque vous atteignez cette limite? Une exception est-elle levée?

127

Il n'y a pas de limite inhérente. Le nombre maximal de threads est déterminé par la quantité de ressources physiques disponibles. Voir ceci article de Raymond Chen pour plus de détails.

Si vous devez demander quel est le nombre maximal de threads, vous faites probablement quelque chose de mal.

[ Mise à jour : Juste par intérêt: Nombre de threads par défaut du pool de threads .NET:

  • 1023 dans Framework 4.0 (environnement 32 bits)
  • 32767 dans Framework 4.0 (environnement 64 bits)
  • 250 par cœur dans Framework 3.5
  • 25 par cœur dans Framework 2.0

(Ces chiffres peuvent varier en fonction du matériel et du système d'exploitation)]

137
Mitch Wheat

Mitch a raison. Cela dépend des ressources (mémoire).

Bien que l'article de Raymond soit dédié aux threads Windows et non aux threads C #, la logique s'applique de la même manière (les threads C # sont mappés sur des threads Windows).

Cependant, comme nous sommes en C #, si nous voulons être complètement précis, nous devons faire la distinction entre les threads "démarrés" et "non démarrés". Seuls les threads démarrés réservent réellement de l’espace de pile (comme on pouvait s’y attendre). Les threads non démarrés n'allouent que les informations requises par un objet thread (vous pouvez utiliser le réflecteur si les membres réels sont intéressés).

Vous pouvez réellement le tester vous-même, comparez:

    static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List<Thread>();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                newThread.Start();
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

avec:

   static void DummyCall()
    {
        Thread.Sleep(1000000000);
    }

    static void Main(string[] args)
    {
        int count = 0;
        var threadList = new List<Thread>();
        try
        {
            while (true)
            {
                Thread newThread = new Thread(new ThreadStart(DummyCall), 1024);
                threadList.Add(newThread);
                count++;
            }
        }
        catch (Exception ex)
        {
        }
    }

Placez un point d'arrêt dans l'exception (mémoire insuffisante, bien sûr) dans VS pour voir la valeur de counter. Il y a une différence très significative, bien sûr.

25
antonio

j'ai fait un test sur un système 64 bits avec la console c #, l'exception est le type de mémoire insuffisante, en utilisant 2949 threads.

Je réalise que nous devrions utiliser le pool de threads, ce que je fais, mais cette réponse est en réponse à la question principale;)

8
MadApples

Vous devez utiliser le pool de threads (ou les délégués asynchrones, qui à leur tour utilisent le pool de threads) afin que le système puisse décider du nombre de threads à exécuter.

6
Ian Boyd

Jeff Richter dans CLR via C #:

"Avec la version 2.0 du CLR, le nombre maximal de threads de travail par défaut est de 25 par CPU dans la machine et le nombre maximal de threads d'E/S est égal à 1000. Une limite de 1000 est en réalité aucune limite."

Notez que ceci est basé sur .NET 2.0. Cela a peut-être changé dans .NET 3.5.

[Edit] Comme @Mitch l'a souligné, cela est spécifique au ThreadPool du CLR. Si vous créez des discussions, consultez les commentaires @Mitch et autres.

4
Ash