Parallelen iteration in C#?
Gibt es eine Möglichkeit, das zu tun foreach
Stil iteration über parallel enumerables in C#? Für subscriptable Listen, ich weiß, man könnte mit einem regulären for
Schleife Durchlaufen eine int-über den index-Bereich, aber ich wirklich lieber foreach
zu for
für eine Reihe von Gründen.
Bonus-Punkte, wenn es funktioniert in C# 2.0
- wäre das nicht eine for-Schleife eine einfachere, kürzere, lesbare Lösung anstelle des Mähdreschers Antwort unten ? was sind Ihre Gründe für die Bevorzugung der foreach-in diesem Fall
- Auch die parallele iteration aufgetaucht in Ruby 1.9-so würde ich Wetten, auf dass es nicht in C# als jetzt.. LISP hatte es aber 🙂
- Ich bin mir nicht sicher, ob ich verstehe die Frage richtig. Versuchen Sie zu iterieren über mehrere enumerables parallel, oder versuchen Sie, eine Schleife über eine aufzählbare, Verarbeitung verschiedene Gegenstände in parallel?
- Ich spreche mehrere enumerables parallel. Wie die parallele arrays von Stiften und Papieren. Ich möchte jeden Bleistift zu schreiben, auf das entsprechende Papier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort, Nein.
foreach
funktioniert nur auf einer aufzählbaren zu einer Zeit.Jedoch, wenn Sie kombinieren Ihre parallele enumerables in einem einzigen, können Sie
foreach
über die Kombination. Ich bin mir nicht bewusst eine einfache, eingebaute Methode, dies zu tun, aber Folgendes sollte funktionieren (obwohl ich es nicht getestet):Dann können Sie
foreach
über die zurückgegebenen enumerable:params IEnumerable<TSource>[] sources
. In diesen Tagen, natürlich würde ich es verwenden, desto mehr explizite Eingabe. Ich würde wahrscheinlich auch dieIEnumerable<T>.Zip
- Erweiterung-Methode für zwei enumerables - ziemlich sicher, dass diese auch nicht existieren, vor fünf Jahren..NET 4 ist die BlockingCollection macht dies ziemlich einfach. Erstellen Sie eine BlockingCollection, wieder in seine .GetConsumingEnumerable() in der enumerable-Methode. Dann die foreach fügt einfach die Blockierung Sammlung.
E. g.
Hoffe, das hilft.
BTW ich veröffentlicht einen blog über diese Letzte Nacht
Andre
Zooba s Antwort ist gut, aber vielleicht möchten Sie auch zu schauen, die Antworten auf "Iterieren über zwei arrays auf einmal".
Schrieb ich eine Implementierung von EachParallel() aus der .NET4 Parallel library. Es ist kompatibel mit .NET 3.5: Die parallele ForEach-Schleife in C# 3.5
Verwendung:
Umsetzung:
Wenn Sie möchten, zu bleiben, um die Grundlagen - ich schrieb die momentan akzeptierte Antwort in einen einfacheren Weg:
Wäre diese Arbeit für Sie?
Für C# 2.0, müssen Sie zum konvertieren von lambda-Ausdrücken vor die Delegierten.
Hinweis: Dieses Dienstprogramm-Methode verwendet hintergrund-threads. Möchten Sie vielleicht ändern Sie es zu einem Einsatz Vordergrund-threads, und wahrscheinlich werden Sie wollen, zu warten, bis alle threads fertig stellen. Wenn Sie das tun, ich schlage vor, Sie erstellen
sources.Length - 1
threads und die aktuellen Ausführungsthread für die letzten (oder ersten) Quelle.(Ich wünschte, ich könnte zählen waiting for threads to finish in meinem code, aber ich bin traurig, dass ich nicht weiß, wie man das doch machen. Ich denke, man sollte mit
einWaitHandle
Thread.Join()
.)