Будет ли это работать для вас?
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
}
Для C # 2.0 вам необходимо преобразовать лямбда-выражения, приведенные выше, в делегаты.
Примечание. Этот служебный метод использует фоновые потоки. Возможно, вы захотите изменить его, чтобы использовать потоки переднего плана, и, возможно, вы захотите дождаться окончания всех потоков. Если вы сделаете это, я предлагаю вам создать sources.Length - 1
потоков и использовать текущий исполняющий поток для последнего (или первого) источника.
(Я хотел бы включить ожидание завершения потоков в своем коде, но мне жаль, что я пока не знаю, как это сделать. Я думаю, вам следует использовать a WaitHandle
Thread.Join()
.)