Questo lavoro potrebbe funzionare?
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
}
Per C# 2.0, è necessario convertire le espressioni lambda di cui sopra in delegati.
Nota: questo metodo di utilità utilizza thread in background. Si consiglia di modificarlo per utilizzare i thread in primo piano e probabilmente si vorrà attendere fino al termine di tutti i thread. Se lo fai, ti suggerisco di creare i thread sources.Length - 1
e di utilizzare il thread di esecuzione corrente per l'ultima (o prima) fonte.
(Vorrei poter includere in attesa che le discussioni per finire nel mio codice, ma mi dispiace che io non so come fare quello ancora. Credo che si dovrebbe usare un WaitHandle
Thread.Join()
.)
fonte
2009-02-07 08:15:51
wouldn' t un ciclo for è una soluzione più semplice, più breve, leggibile invece della risposta Combine di seguito? quali sono le tue ragioni per preferire foreach in questo caso – Gishu
Anche l'iterazione parallela è appena emersa in Ruby 1.9 quindi avrei scommesso su di esso non in C# come ora. LISP ce l'aveva però :) – Gishu
Non sono sicuro di aver capito domanda correttamente. Stai cercando di eseguire iterazioni su più enumerabili in parallelo o stai cercando di eseguire il ciclo su una enumerabile, elaborando elementi diversi in parallelo? –