ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew

¿cuál es la diferencia entre el siguiente

ThreadPool.QueueUserWorkItem 

vs

 Task.Factory.StartNew 

Si el código anterior se llama 500 veces para alguna tarea larga, ¿significa que se tomarán todos los hilos del grupo de subprocesos?

¿O será TPL (segunda opción) lo suficientemente inteligente como para tomar hilos menos o igual a la cantidad de procesadores?

Si va a iniciar una tarea de larga ejecución con TPL, debe especificar TaskCreationOptions.LongRunning , lo que significa que no lo progtwigrá en el grupo de subprocesos. (EDITAR: Como se señala en los comentarios, esta es una decisión específica del planificador, y no es una garantía dura y rápida, pero espero que cualquier planificador de producción sensato evite progtwigr tareas de larga ejecución en un grupo de subprocesos).

Definitivamente no debe progtwigr una gran cantidad de tareas de larga ejecución en el grupo de subprocesos usted mismo. Creo que actualmente el tamaño predeterminado del grupo de subprocesos es bastante grande (porque a menudo se abusa de esta manera), pero fundamentalmente no se debe usar así.

El objective del grupo de subprocesos es evitar que las tareas cortas obtengan un gran impacto de la creación de un nuevo subproceso, en comparación con el tiempo que realmente están ejecutándose. Si la tarea se ejecutará durante un tiempo prolongado, el impacto de crear un nuevo subproceso será relativamente pequeño de todos modos, y no querrá terminar potencialmente sin subprocesos del grupo de subprocesos. (Es menos probable ahora, pero lo experimenté en versiones anteriores de .NET).

Personalmente, si tuviera la opción, definitivamente usaría TPL con el argumento de que la API de Task es bastante buena, pero recuerde decirle a TPL que espera que la tarea se ejecute durante mucho tiempo.

EDITAR: Como se señala en los comentarios, consulte también la publicación de blog del equipo PFX sobre cómo elegir entre el TPL y el grupo de subprocesos :

En conclusión, reiteraré lo que el desarrollador de ThreadPool del equipo de CLR ya ha indicado:

 Task is now the preferred way to queue work to the thread pool. 

EDITAR: También a partir de los comentarios, no olvide que TPL le permite usar progtwigdores personalizados , si realmente desea …