2012-03-13 15 views

Respuesta

7

El número máximo de subprocesos en el ThreadPool se establece en alrededor de 1000 subprocesos en un sistema .NET4.0 de 32 bits. Es menos para versiones anteriores de .NET. Si tiene 1000 hilos en proceso, digamos que están bloqueando por alguna razón, cuando pone en cola la tarea número 1001, nunca se ejecutará.

Nunca alcanzará el recuento máximo de hilos en un proceso de 32 bits. Tenga en cuenta que cada subproceso requiere al menos 1 MB de memoria (ese es el tamaño de la pila del modo de usuario), más cualquier otro gasto adicional. Ya ha perdido mucha memoria del CLR y de las DLL nativas cargadas, por lo que deberá presionar una OutOfMemoryException antes de utilizar esa cantidad de subprocesos.

Puede cambiar el número de hilos que ThreadPool puede usar, llamando al método ThreadPool.SetMaxThreads. Sin embargo, si espera utilizar muchos subprocesos, tiene un problema más grande con su código. Hago NO le recomiendo que juegue con configuraciones ThreadPool como esa. Lo más probable es que obtengas un peor rendimiento.

Tenga en cuenta que con Task y ThreadPool.QueueUserWorkItem, los hilos se vuelven a utilizar cuando terminan. Si crea una tarea o pone en cola un hilo de subproceso, puede o no puede crear un nuevo subproceso para ejecutar su código. Si ya hay subprocesos disponibles en el grupo, volverá a utilizar uno de ellos en lugar de crear (un costoso) nuevo subproceso. Solo si los métodos que está ejecutando en las tareas nunca regresan, debería preocuparse por quedarse sin hilos, pero como dije, ese es un problema completamente diferente con su código.

+0

Supongo que el hilo 1001st se pondría en cola y se ejecutaría si uno de los subprocesos desbloquea – Jon

+0

@Jon, eso es correcto. Bueno, en un sistema de 32 bits, no es probable que pueda ejecutar 1000 hilos sin quedarse sin memoria, pero sí, suponiendo que eso no ocurra, ese hilo finalmente se ejecutará cuando se libere un hilo. –

+0

+1 para el detalle del uso de la memoria por subproceso –

6

De forma predeterminada, MaxThreads del ThreadPool es muy alto. Por lo general, nunca llegarás allí, tu aplicación se bloqueará primero.

Entonces, cuando todos los hilos están ocupados, las tareas nuevas se ponen en cola y lentamente, como máximo 1 por 500 ms, el TP asignará nuevos hilos.

+0

¿Alguna manera de saber aproximadamente qué es la propiedad MaxThreads? – Jon

+0

Llama a [Método ThreadPool.GetMaxThreads] (http://msdn.microsoft.com/en-us/library/system.threading.threadpool.getmaxthreads%28v=vs.100%29.aspx) –

4

No aumentará MaxThreads. Cuando hay más tareas que los subprocesos de trabajo disponibles, algunas tareas se pondrán en cola y esperarán hasta que el grupo de subprocesos proporcione un subproceso disponible. Hace algunas cosas bastante avanzadas para escalar con una gran cantidad de núcleos (robo de trabajo, inyección de hilo, etc.).

+1

No aumentará MaxThreads. Definitivamente puede hacer algunos nuevos hilos –

+0

Whoops, aclarado. Gracias. –

Cuestiones relacionadas