¿Cuál es el número máximo de hilos que puede crear en una aplicación C #? ¿Y qué pasa cuando alcanzas este límite? ¿Se lanza una excepción de algún tipo?
c#
.net
multithreading
John Saunders
fuente
fuente
Respuestas:
No hay límite inherente. El número máximo de subprocesos está determinado por la cantidad de recursos físicos disponibles. Vea este artículo de Raymond Chen para detalles.
Si necesita preguntar cuál es el número máximo de subprocesos, probablemente esté haciendo algo mal.
[ Actualización : solo por interés: .NET Thread Pool números predeterminados de hilos:
(Estos números pueden variar según el hardware y el sistema operativo)]
fuente
Mitch tiene razón. Depende de los recursos (memoria).
Aunque el artículo de Raymond está dedicado a los hilos de Windows, no a los hilos de C #, la lógica aplica lo mismo (los hilos de C # se asignan a los hilos de Windows).
Sin embargo, como estamos en C #, si queremos ser completamente precisos, necesitamos distinguir entre hilos "iniciados" y "no iniciados". Solo los hilos iniciados en realidad reservan espacio de pila (como podríamos esperar). Los subprocesos no iniciados solo asignan la información requerida por un objeto de subproceso (puede usar el reflector si está interesado en los miembros reales).
Realmente puedes probarlo por ti mismo, compara:
con:
Coloque 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.
fuente
Hice una prueba en un sistema de 64 bits con consola C #, la excepción es el tipo de falta de memoria, utilizando 2949 subprocesos.
Me doy cuenta de que deberíamos usar el grupo de subprocesos, lo que hago, pero esta respuesta es en respuesta a la pregunta principal;)
fuente
Debería usar el grupo de subprocesos (o delegados asíncronos, que a su vez usan el grupo de subprocesos) para que el sistema pueda decidir cuántos subprocesos deben ejecutarse.
fuente
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 predeterminados a 25 por CPU en la máquina y el número máximo de subprocesos de E / S por defecto a 1000. Un límite de 1000 es efectivamente ningún límite".
Tenga en cuenta que esto se basa en .NET 2.0. Esto puede haber cambiado en .NET 3.5.
[Editar] Como señaló @Mitch, esto es específico del CLR ThreadPool. Si está creando hilos directamente, vea los comentarios de @Mitch y otros.
fuente
Puede probarlo usando este código recortado:
Tenga cuidado con el modo de aplicación de 32 bits y 64 bits.
fuente
Recomendaría ejecutar el método ThreadPool.GetMaxThreads en depuración
Documentos y ejemplos: https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.getmaxthreads?view=netframework-4.8
fuente