Czy ta praca jest dla Ciebie?
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
}
Dla języka C# 2.0 należy przekonwertować wyrażenia lambda powyżej na delegatów.
Uwaga: Ta metoda narzędziowa wykorzystuje wątki w tle. Możesz go zmodyfikować, aby używał wątków pierwszoplanowych i prawdopodobnie będziesz chciał poczekać, aż wszystkie wątki zakończą się. Jeśli to zrobisz, proponuję utworzyć wątki sources.Length - 1
i użyć bieżącego wątku wykonawczego dla ostatniego (lub pierwszego) źródła.
(Chciałabym to czeka na wątków do końca w moim kodu, ale przykro mi, że nie wiem, jak to zrobić jeszcze to. Myślę, że należy użyć WaitHandle
Thread.Join()
).
Wouldn” t pętla for powinna być prostszym, krótszym, czytelnym rozwiązaniem zamiast odpowiedzi Combine poniżej? Jakie są twoje powody, dla których preferujesz foreach w tym przypadku? – Gishu
Równoległa iteracja właśnie pojawiła się w Rubim 1.9, więc założyłbym się, że nie jest w C# od teraz ... LISP miał to jednak :) – Gishu
Nie jestem pewien, czy rozumiem pytanie poprawnie. Czy próbujesz iterować równolegle do wielu wyliczanek, czy też próbujesz wykonać pętlę nad jednym przeliczalnym, przetwarzając różne elementy równolegle? –