2017-06-07 4 views
2

Ich frage mich, was die Differenz zwischen AsParallel undAsParallel.Select() in C# ist, da beide die Instanz von AsParallelQuery zurückgibt. folgende Code-Schnipsel vor:Unterschied zwischen AsParallel und AsParallel.Select in C#

var list = Enumerable.Range(1, 100).ToList(); 

      var parallelList = list.AsParallel(); 
      foreach (var num in parallelList) 
       System.Console.WriteLine(num);//returns 1 ..100 in order 

      var query = list.AsParallel().Select(num => num); 

      foreach (var num in query) 
       System.Console.WriteLine(num);/*returns 1..100 not in order*/ 

      parallelList.ForEach(System.Console.WriteLine); //returns 1 ..100 in order 

Ich frage mich, wie list.AsParallel() und list.AsParallel() Wählen Sie() unterschiedlich interpretiert

+1

'' Select'' transformiert die Elemente der Liste in eine andere Form. In Ihrem Codebeispiel gibt select einfach das gleiche Element aus, das es als Eingabe empfängt, und macht daher nichts anderes als die '' list.AsParallel() '' ohne '' Select''. –

+0

aber wie Iteration über 'ParallelQuery ', die sie geordnete, wie ich verstehe, 'AsParallel()', sollte die Abfrage parallel (Datenparallelität) auslösen und Ergebnis sollte nicht in Reihenfolge sowie –

+3

gesammelt werden Sie tun die Iteration in 'foreach'-Anweisung, die nicht über die Parallelisierung informiert ist, iteriert sie einfach über die Sammlung in ** einem ** -Thread – VMAtm

Antwort

3

Was AsParallel() tut, ist, dass es bedeutet, dass alle folgenden LINQ Methoden. parallel ausgeführt werden. Was es macht nicht direkt beeinflussen ist, wie foreach verhält.

Also, das:

var parallelList = list.AsParallel(); 

foreach (var num in parallelList) 
    System.Console.WriteLine(num);//returns 1 ..100 in order 

ist nur eine verwirrende Weise list iterieren. Es macht nichts parallel.

Während dies:

var query = list.AsParallel().Select(num => num); 

foreach (var num in query) 
    System.Console.WriteLine(num);/*returns 1..100 not in order*/ 

die (nutzlosen) Select Abfrage parallel ausführt, die die Reihenfolge der Elemente ändern können. Aber die foreach wird immer noch in einem einzigen Thread ausgeführt.

Schließlich folgt aus:

parallelList.ForEach(System.Console.WriteLine); //returns 1 ..100 in order 

nicht kompiliert, es sei denn, Sie einige benutzerdefinierte ForEach Extension-Methode haben, wahrscheinlich das gleiche wie foreach verhalten. (Es gibt ForAll, aber das ist anders.)

Verwandte Themen