¿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?¿Número máximo de subprocesos en una aplicación .NET?
Respuesta
No hay límite inherente. La cantidad máxima de subprocesos está determinada por la cantidad de recursos físicos disponibles. Consulte esto article by 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 curiosidad: .NET subproceso del grupo de números predeterminados de hilos:
- 1023 en Framework 4.0 (entorno de 32 bits)
- 32768 en Framework 4.0 (64 bits medio ambiente)
- 250 por núcleo en el Marco 3.5
- 25 por núcleo en el Marco 2,0
(Estos números pueden variar dependiendo del hardware y OS)]
¿Cómo resolvió esto? ¿Sabes lo que es .NET 4.5 o lo que será 5.0? – LamonteCristo
preguntándose de dónde vino ese número – RollRoll
Puede usar este código para obtener los conteos: \t \t \t int workerThreads; \t \t \t int completionPortThreads; \t \t \t ThreadPool.GetMaxThreads (out workerThreads, out completionPortThreads); – JALLRED
Jeff Richter en CLR a través de C#:
"Con la versión 2.0 de la CLR, el máximo número de defecto subprocesos de trabajo al 25 por CPU en la máquina y el número máximo de E/S hilos tiene como valor predeterminado 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 @Mitch señaló, esto es específico de la CLR ThreadPool. Si está creando hilos directamente, vea @Mitch y otros comentarios.
Creo que te estás refiriendo a la lista de temas. –
Está confundiendo CLR 2.0 y .NET 2.0 en su comentario sobre .NET 3.5. – bzlm
Por lo que sé, el SP1 para .NET 2.0 (parte de .NET 3.5) cambió los subprocesos de trabajo por defecto a 250 por CPU/núcleo para grupos de subprocesos. –
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 pila (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 se puede comprobar por sí mismo, comparar:
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)
{
}
}
con:
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)
{
}
}
Deja un punto de interrupción en la excepción (fuera de la memoria, por supuesto) en VS para ver el valor de contador. Hay una diferencia muy significativa, por supuesto.
Debe utilizar el grupo de subprocesos (o delegados asincrónicos, que a su vez usan el grupo de subprocesos) para que el sistema pueda decidir cuántos subprocesos se deben ejecutar.
-1: grupo de subprocesos se menciona en varios de los comentarios. –
La respuesta * es * para dejar que el sistema decida. –
@Ian: Te recomendé porque la misma respuesta se dio nueve meses antes. –
hice una prueba en un sistema de 64 bits con consola C#, la excepción es el tipo de falta de memoria, con 2949 hilos.
Me di cuenta que deberíamos usar la piscina de roscado, lo que hago, pero esta respuesta es una respuesta a la pregunta principal;)
- 1. Número de hilo máximo para una aplicación?
- 2. Subprocesos nativos en una aplicación .Net
- 3. Cómo limitar el número máximo de subprocesos paralelos en Perl
- 4. Cambiar el límite del número máximo de subprocesos por una aplicación
- 5. Número máximo de usuarios para una aplicación web
- 6. ¿Cuál es el máximo número de métodos por clase .NET
- 7. Monitoreo de subprocesos .NET
- 8. Número máximo de Ruby
- 9. ¿Cómo encontrar el tamaño máximo de pila actual de subprocesos en .net?
- 10. Número máximo de Err.Raise?
- 11. Número máximo de subprocesos que se pueden iniciar en un único kernel CUDA
- 12. ¿Cómo aumentar el número de subprocesos en el grupo de subprocesos de tomcat?
- 13. ¿Número máximo de filas en una tabla sqlite?
- 14. Número máximo de HttpWebRequests concurrentes
- 15. ¿Cómo puedo establecer el número máximo de procesos o subprocesos de MySQL?
- 16. OpenSSL configure el número máximo de conexiones
- 17. Subprocesos de aplicación vs Subprocesos de servicio
- 18. Parámetros de función número máximo
- 19. Número máximo de instrucciones GLSL
- 20. Número máximo de cookies permitidas
- 21. Número máximo (utilizable) de filas en una tabla de Postgresql
- 22. Número máximo de elementos enum en Java
- 23. Uso de TPL cómo configuro un tamaño máximo de subprocesos
- 24. Número máximo de unidades en windows?
- 25. Número máximo de dimensiones en una matriz Java
- 26. Número máximo de tablas en MySQL
- 27. ¿Número máximo de inodos en un directorio?
- 28. Número máximo de procesos en Linux
- 29. Cómo limitar el número de subprocesos/subprocesos utilizados en una función en bash
- 30. Depuración de una aplicación de subprocesos múltiples
La respuesta diferirá si se está ejecutando en el x64 VM o la x86 VM –
En mi situación es x86, pero ¿puede proporcionar la respuesta para ambos en caso de que alguien más lo necesite? –