Wie, um eine IEnumerable-Methode parallel-Methode
Nach diesem post, Ich will parallelisieren dieser Methode :
public IEnumerable<string> GetAllLogs(IEnumerable<IComputer> computers)
{
foreach (var cpt in computers)
{
foreach (var log in cpt.GetLogs())
{
yield return log;
}
}
}
Möchte ich die Methode "geben gibt" ist ein Protokoll, wenn man von der Methode GetLogs fertig ist. Wenn ich 4 Computer gibt :
- Computer 01 : "a", "b", "c", "d", "e"
- Computer 02 : "1", "2", "3", "4", "5"
- Computer-03 : "alpha", "beta", "gamma", "delta", "epsilon"
- Computer 04 : "I", "II", "III", "IV", "V"
Mit der "sequenzielle Methode", die Ausgabe ist :
a
b
c
d
e
1
2
3
4
5
alpha
beta
gamma
delta
epsilon
I
II
III
IV
V
Und der Methoden läuft in 20 Sekunden. es ist ein Thread.Sleep(1000)
im GetLogs
Methode.
Möchte ich die Ausgabe sieht wie folgt aus :
III
a
4
gamma
b
c
IV
5
d
II
beta
e
1
2
delta
alpha
3
epsilon
I
und verläuft in wenigen Sekunden.
Möchte ich die Methoden liefert ein IEnumerable
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, was Sie brauchen:
Wenn Sie möchten, um die Bearbeitung von 4
computer
-s zur gleichen Zeit, können Sie stellen Sie den Grad der Parallelität wie diese:Folgenden ist eine vereinfachte Erklärung gerade für das Verständnis.
Um zu lernen mehr über, besuchen Sie einfach PLINQ (Parallel LINQ) auf der MSDN-Website.
Gut,
.AsParallel()
teilt dascomputers
enumerable in 4 Teile und beginnt, die 4 threads gleichzeitig. Jeder thread führtcpt.GetLogs()
für jedencomputer
. Das Ergebnis istIEnumerable<IEnumerable<string>>
- aufzählbaren von enumerables.SelectMany()
wird verwendet, um glätten diese Liste durch die Verkettung innerer enumerables und die Beseitigung der äußeren. Ergebnisse zusammengeführt werden automatisch zurück in den Haupt-thread in der Reihenfolge Ihrer Ankunft.yield
.GetLogs
. Die Methode gibt sofort einen Wert zurück. Die Werte werden abgefragt und zurückgegeben Durchlaufen werden, sobald Sie Durchlaufen es.GetLogs
und kehrt nach alles Lesen.