Para obtener el máximo rendimiento con unidades que se ejecutan simultáneamente, escriba su propio grupo de subprocesos, donde se crea un grupo de objetos de subprocesos al inicio y se pasa al bloqueo (anteriormente suspendido), esperando que se ejecute un contexto (un objeto con una interfaz estándar implementada por tu codigo).
Muchos artículos sobre Tareas frente a subprocesos frente a .NET ThreadPool no le ofrecen realmente lo que necesita para tomar una decisión de rendimiento. Pero cuando los comparas, los hilos ganan y especialmente un grupo de hilos. Se distribuyen mejor entre las CPU y se inician más rápido.
Lo que debe discutirse es el hecho de que la unidad de ejecución principal de Windows (incluido Windows 10) es un subproceso, y la sobrecarga de cambio de contexto del sistema operativo suele ser insignificante. En pocas palabras, no he podido encontrar evidencia convincente de muchos de estos artículos, ya sea que el artículo afirme un mayor rendimiento al guardar el cambio de contexto o un mejor uso de la CPU.
Ahora por un poco de realismo:
La mayoría de nosotros no necesitará que nuestra aplicación sea determinista, y la mayoría de nosotros no tenemos un fondo duro con hilos, que por ejemplo a menudo viene con el desarrollo de un sistema operativo. Lo que escribí arriba no es para un principiante.
Entonces, lo que puede ser más importante es discutir qué es fácil de programar.
Si crea su propio grupo de subprocesos, tendrá que escribir un poco, ya que deberá preocuparse por el seguimiento del estado de ejecución, cómo simular la suspensión y la reanudación, y cómo cancelar la ejecución, incluso en toda una aplicación apagar. Es posible que también deba preocuparse si desea hacer crecer dinámicamente su grupo y también qué limitación de capacidad tendrá su grupo. Puedo escribir ese marco en una hora, pero eso es porque lo he hecho muchas veces.
Quizás la forma más fácil de escribir una unidad de ejecución es usar una tarea. La belleza de una tarea es que puede crear una y ponerla en línea en su código (aunque se debe tener precaución). Puede pasar un token de cancelación para controlar cuándo desea cancelar la Tarea. Además, utiliza el enfoque de promesa para encadenar eventos, y puede hacer que devuelva un tipo específico de valor. Además, con async y wait, existen más opciones y su código será más portátil.
En esencia, es importante comprender los pros y los contras con Tareas vs. Threads vs. .NET ThreadPool. Si necesito un alto rendimiento, voy a usar hilos, y prefiero usar mi propio grupo.
Una manera fácil de comparar es iniciar 512 hilos, 512 tareas y 512 hilos de ThreadPool. Al principio encontrará un retraso con los subprocesos (por lo tanto, por qué escribir un grupo de subprocesos), pero los 512 subprocesos se ejecutarán en unos segundos mientras que los subprocesos de tareas y .NET ThreadPool tardan unos minutos en comenzar.
A continuación se muestran los resultados de dicha prueba (i5 quad core con 16 GB de RAM), que se ejecutan cada 30 segundos. El código ejecutado realiza E / S de archivo simple en una unidad SSD.
Resultados de la prueba