8

Tengo una aplicación en C# con una lista de tareas pendientes. Estoy buscando hacer tanto de ese trabajo como sea posible en paralelo. Sin embargo, necesito poder controlar la cantidad máxima de tareas paralelas.Tareas vs ThreadPool

Según tengo entendido, esto es posible con un ThreadPool o con tareas. ¿Hay alguna diferencia en cuál usar? Mi principal preocupación es poder controlar cuántos subprocesos están activos a la vez.

+0

¿Está absolutamente seguro de que necesita controlar la cantidad de subprocesos en ejecución? ¿O simplemente necesita controlar la cantidad de trabajos en curso? – Gusdor

Respuesta

19

favor, eche un vistazo a ParallelOptions.MaxDegreeOfParallelism para Task s.

Te aconsejaría que uses Tareas, ya que proporcionan una mayor abstracción de nivel que ThreadPool.

Una muy buena lectura sobre el tema se puede encontrar here. Realmente, un libro imprescindible y es gratis además de eso :)

2

También puede crear un semáforo para controlar cuántos subprocesos se pueden ejecutar a la vez. Puede crear un nuevo semáforo y en el constructor especificar cuántos subprocesos simultáneos pueden usar ese semáforo a la vez. Como no sé cómo vas a usar los hilos, este sería un buen punto de partida.

MSDN Article on the Semaphore class

-Wesley

3

En este article on msdn, explican por qué recomiendan Tareas en lugar de ThreadPool para el Paralelismo.

2

Tarea tiene una característica muy encantadora para mí, puede crear cadenas de tareas. Que se ejecutan en ciertos resultados de la tarea anterior. Una característica que uso a menudo es la siguiente: la tarea A se ejecuta en segundo plano para realizar un trabajo de larga ejecución. Encadenó la Tarea B después de ella, solo se ejecutó cuando la Tarea A terminó de forma regular y la configuré para ejecutarla en primer plano, así puedo actualizar fácilmente mis controles con el resultado de una larga ejecución. Tarea A.

5

En TPL puede usar la WithDegreeOfParallelism en un ParallelEnumerable o ParallelOptions.MaxDegreeOfParallism

también existe la CountdownEvent que puede ser una mejor opción si usted está usando hilos o tareas personalizadas.

En el ThreadPool, cuando usa SetMaxThreads es global para el AppDomain, por lo que podría estar limitando innecesariamente el código no relacionado.

No puede establecer el número de subprocesos de trabajo o el número de subprocesos de finalización de E/S en un número menor que el número de procesadores en la computadora.

Si el tiempo de ejecución de idioma común está alojado, por ejemplo, por Internet Information Services (IIS) o SQL Server, el host puede limitar o evitar cambios en el tamaño del grupo de subprocesos.

Tenga cuidado al cambiar el número máximo de subprocesos en el grupo de subprocesos. Si bien su código puede ser beneficioso, los cambios pueden tener un efecto adverso en las bibliotecas de códigos que utiliza.

Configurar el tamaño del grupo de subprocesos demasiado grande puede causar problemas de rendimiento. Si se ejecutan demasiados subprocesos al mismo tiempo, la sobrecarga de conmutación de tareas se convierte en un factor importante.

Estoy de acuerdo con la otra respuesta que se debe utilizar durante el TPL ThreadPool como una mejor captación de múltiples hilos, pero su posible lograr lo que desea en ambos.

Cuestiones relacionadas