¿Funcionaría para usted?
public static class Parallel
{
public static void ForEach<T>(IEnumerable<T>[] sources,
Action<T> action)
{
foreach (var enumerable in sources)
{
ThreadPool.QueueUserWorkItem(source => {
foreach (var item in (IEnumerable<T>)source)
action(item);
}, enumerable);
}
}
}
// sample usage:
static void Main()
{
string[] s1 = { "1", "2", "3" };
string[] s2 = { "4", "5", "6" };
IEnumerable<string>[] sources = { s1, s2 };
Parallel.ForEach(sources, s => Console.WriteLine(s));
Thread.Sleep(0); // allow background threads to work
}
Para C# 2.0, debe convertir las expresiones lambda anteriores en delegadas.
Nota: Este método de utilidad utiliza subprocesos de fondo. Es posible que desee modificarlo para utilizar subprocesos de primer plano, y probablemente desee esperar hasta que finalicen todos los subprocesos. Si lo hace, le sugiero que cree subprocesos sources.Length - 1
, y use el subproceso de ejecución actual para la última (o primera) fuente.
(Me gustaría poder incluir a la espera de hilos para terminar en mi código, pero lo siento que no sé cómo hacer eso todavía. Creo que se debe utilizar un WaitHandle
Thread.Join()
.)
wouldn' ¿Es posible que un bucle for sea una solución más simple, más corta y legible en lugar de la respuesta Combine a continuación? ¿Cuáles son sus razones para preferir foreach en este caso? – Gishu
También la iteración paralela acaba de salir a la luz en Ruby 1.9, así que apostaría que no está en C# a partir de ahora ... LISP lo tuvo :) – Gishu
No estoy seguro de entender el pregunta correcta ¿Está tratando de iterar en múltiples enumerables en paralelo, o está tratando de recorrer un enumerable, procesando diferentes elementos en paralelo? –