ejemplo - threadpool.queueuserworkitem example c#
ThreadPool max hilos (3)
En primer lugar revise este enlace , especialmente este comentario:
Si el tiempo de ejecución del idioma común está alojado, por ejemplo, Internet Information Services (IIS) o SQL Server, el host puede limitar o evitar cambios en el tamaño del grupo de subprocesos.
Luego debe verificar el valor de retorno del ThreadPool.SetMaxThreads(threads, threads)
. Tal vez devuelve false
?
Tengo algunos problemas con ThreadPool de .NET (.NET 4).
He leído que, de forma predeterminada, .NET tiene un límite de 25 subprocesos por procesador, pero de acuerdo con las publicaciones del foro en SO y en otros lugares, puedo aumentar el límite con el siguiente código.
void SetThreads(int threads)
{
ThreadPool.SetMaxThreads(threads, threads);
ThreadPool.SetMinThreads(threads, threads);
}
Sin embargo, cuando establezco lo anterior en un número arbitrariamente alto, por ejemplo, 2000, y en la cola ~ 1000 elementos, todavía tengo ~ 33 hilos en ejecución (.NET CLR toma ~ 5 hilos), y ThreadPool.GetAvailableThreads()
devuelve 1971 hilos restantes.
¿Por qué no funciona el código anterior?
En primer lugar, su "conocimiento" de los valores predeterminados es incorrecto. El límite de 25 subprocesos por procesador se recuperó de .NET 1.1. Se incrementó en .NET 2, y ahora :
A partir de .NET Framework versión 4, el tamaño predeterminado del grupo de subprocesos para un proceso depende de varios factores, como el tamaño del espacio de direcciones virtuales. Un proceso puede llamar al método GetMaxThreads para determinar el número de subprocesos.
Sin embargo, hay algo más en juego: el grupo de subprocesos no crea inmediatamente nuevos subprocesos en todas las situaciones. Con el fin de hacer frente a ráfagas de pequeñas tareas, limita la rapidez con la que crea nuevos hilos. IIRC, creará un subproceso cada 0,5 segundos si hay tareas pendientes, hasta el número máximo de subprocesos. No puedo ver inmediatamente esa figura documentada, así que puede cambiar. Sospecho fuertemente que eso es lo que estás viendo. Intente poner en cola muchos elementos y luego supervise la cantidad de subprocesos a lo largo del tiempo.
Cuando la demanda es baja, el número real de subprocesos de la agrupación de hilos puede caer por debajo de los valores mínimos.
Lea esto también: Patrones para la programación paralela: comprensión y aplicación de patrones paralelos con .NET Framework 4