He estado repasando la funcionalidad de algunas de las nuevas características paralelas en .Net 4.0.Funciones paralelas en .Net 4.0
Decir que tengo código de este modo:
foreach (var item in myEnumerable)
myDatabase.Insert(item.ConvertToDatabase());
Imagínese myDatabase.Insert está realizando un trabajo para insertar a una base de datos SQL.
En teoría se podría escribir:
Parallel.ForEach(myEnumerable, item => myDatabase.Insert(item.ConvertToDatabase()));
y automáticamente obtener el código que se aprovecha de múltiples núcleos.
Pero, ¿qué ocurre si myEnumerable solo puede interactuar con un solo hilo? ¿La clase Parallel enumerará por un solo hilo y solo distribuirá el resultado a los hilos de trabajo en el ciclo?
¿Qué ocurre si myDatabase solo puede interactuar con un único hilo? Ciertamente, no sería mejor hacer una conexión de base de datos por iteración del ciclo.
Finalmente, ¿qué ocurre si mi "var item" es un UserControl o algo con lo que se debe interactuar en el hilo de UI?
¿Qué patrón de diseño debo seguir para resolver estos problemas?
Me parece que el cambio a Parallel/PLinq/etc no es exactamente fácil cuando se trata de aplicaciones del mundo real.
Mejor respuesta hasta el momento, pregunta lateral: decir que mi cuerpo de bucle realiza una operación IO de larga ejecución (solicitud de red, base de datos, etc.), ¿detectará la clase Parallel hilos suspendidos/suspendidos y automáticamente iniciará uno nuevo? ¿O estará limitado a la cantidad de núcleos en la máquina? – jonathanpeppers
@ Jonathan.Peppers: el programador de tareas predeterminado maneja esto bastante bien. Inyectará trabajo adicional en la situación. (De forma predeterminada, ThreadPool usa muchos más elementos que subprocesos, y reduce la escala según la carga de trabajo de forma dinámica) –