¿Número máximo de hilos en una aplicación .NET?

¿Cuál es la cantidad máxima de hilos que puede crear en una aplicación C #? ¿Y qué pasa cuando alcanzas este límite? Es una excepción de algún tipo arrojado?

No hay un límite inherente. La cantidad máxima de subprocesos está determinada por la cantidad de recursos físicos disponibles. Vea este artículo de Raymond Chen para detalles.

Si necesita preguntar cuál es la cantidad máxima de hilos, probablemente esté haciendo algo mal.

[ Actualización : solo por interés: número de subprocesos .NET Thread Pool por defecto:

  • 1023 en Framework 4.0 (entorno de 32 bits)
  • 32768 en Framework 4.0 (entorno de 64 bits)
  • 250 por núcleo en el Marco 3.5
  • 25 por núcleo en Framework 2.0

(Estos números pueden variar según el hardware y el sistema operativo)]

Mitch tiene razón. Depende de los recursos (memoria).

Aunque el artículo de Raymond está dedicado a subprocesos de Windows, no a subprocesos de C #, la lógica aplica lo mismo (los subprocesos de C # se asignan a subprocesos de Windows).

Sin embargo, como estamos en C #, si queremos ser completamente precisos, debemos distinguir entre los hilos “iniciado” y “no iniciado”. Solo los hilos iniciados en realidad reservan espacio de stack (como podríamos esperar). Los subprocesos no iniciados solo asignan la información requerida por un objeto de subproceso (puede usar reflector si está interesado en los miembros reales).

En realidad puede probarlo usted mismo, compare:

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

con:

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

Ponga un punto de interrupción en la excepción (sin memoria, por supuesto) en VS para ver el valor del contador. Hay una diferencia muy significativa, por supuesto.

Hice una prueba en un sistema de 64 bits con la consola c #, la excepción es el tipo de falta de memoria, utilizando 2949 hilos.

Me doy cuenta de que deberíamos usar el grupo de threading, lo que hago, pero esta respuesta es en respuesta a la pregunta principal;)

Debería utilizar el grupo de subprocesos (o delegates asincrónicos, que a su vez utilizan el grupo de subprocesos) para que el sistema pueda decidir cuántos subprocesos se deben ejecutar.

Jeff Richter en CLR a través de C #:

“Con la versión 2.0 del CLR, el número máximo de subprocesos de trabajo predeterminado es de 25 por CPU en la máquina y el número máximo de subprocesos de E / S es 1000 por defecto. Un límite de 1000 no tiene límite”.

Tenga en cuenta que esto se basa en .NET 2.0. Esto puede haber cambiado en .NET 3.5.

[Editar] Como @Mitch señaló, esto es específico de CLR ThreadPool. Si está creando hilos directamente, vea @Mitch y otros comentarios.