2013-10-09 8 views
7

ich in diesem Code suchenAsSequential Verwendung, um die Ordnung zu bewahren

var numbers = Enumerable.Range(0, 20); 
var parallelResult = numbers.AsParallel().AsOrdered() 
    .Where(i => i % 2 == 0).AsSequential(); 

foreach (int i in parallelResult.Take(5)) 
    Console.WriteLine(i); 

Die AsSequential() soll sortiert die resultierende Anordnung machen. Eigentlich ist es nach seiner Ausführung sortiert, aber wenn ich den Anruf zu AsSequential() entferne, wird es immer noch sortiert (seit AsOrdered()) angerufen.

Was ist der Unterschied zwischen den beiden?

+0

Es gibt kein "resulting array", da dieses Beispiel im Buch nicht '.ToArray()' verwendet (ich nehme an, Sie beziehen sich auf [Programmierung in C# Exam Ref 70-483] (https: //www.microsoftpressstore .com/store/exam-ref-70-483-Programmierung-in-c-sharp-mcsd-9780735676824)). – comecme

Antwort

10

AsSequential soll nur jede weitere parallele Ausführung stoppen - daher der Name. Ich bin mir nicht sicher, woher Sie die Idee hatten, dass es das resultierende Array "sortierte". Die documentation ist ziemlich klar:

Konvertiert eine ParallelQuery in ein IEnumerable, um sequenzielle Auswertung der Abfrage zu erzwingen.

Wie Sie sagen, AsOrdered sorgt für die Bestellung (für diese bestimmte Sequenz).

+0

Das Buch, das ich beziehe, sagt: "Wenn Sie eine komplexe Abfrage haben, die von der parallelen Verarbeitung profitieren kann, aber auch über einige Teile verfügt, die sequenziell ausgeführt werden sollen, können Sie AsQuent verwenden, um die parallele Verarbeitung Ihrer Abfrage zu verhindern Das Szenario, in dem dies erforderlich ist, besteht darin, die Reihenfolge Ihrer Abfrage beizubehalten. Listing 1-25 zeigt, wie Sie den Operator AsSequential verwenden können, um sicherzustellen, dass die Take-Methode Ihre Bestellung nicht durcheinanderbringt. " Ich habe Ihren Link überprüft und Sie haben absolut Recht. – MaPi

+0

@ user1648371: Klingt wie ein Problem in dem Buch, ja. –

+0

Die [specs] (https://msdn.microsoft.com/en-us/library/dd460680 (v = vs.110) .aspx) sagen 'AsSequential' wird verwendet, um die Reihenfolge beizubehalten, die durch die vorherigen Klauseln eingerichtet wurde. Würde es nur bei SQL-Abfragen funktionieren? Die [specs] (https://msdn.microsoft.com/en-us/library/dd997399 (v = vs.110) .aspx # Anchor_1) geben außerdem an, dass 'Take' verhindern wird, dass die Laufzeitumgebung trotzdem die Parallelität verwendet. Also ist das Buch falsch oder nicht? Ich bin verwirrt. – comecme

2

Ich weiß, dass dies über ein Jahr alt gefragt wurde, aber hier sind meine zwei Cent.

Im Beispiel exposed, glaube ich, dass es AsSequential verwendet, so dass der nächste Abfrageoperator (in diesem Fall der Operator Take) sequenziell ausgeführt wird.

Der Operator Take verhindert jedoch, dass eine Abfrage parallelisiert wird, es sei denn, die Quellelemente befinden sich in ihrer ursprünglichen Indizierungsposition. Aus diesem Grund wird das Ergebnis auch dann sortiert, wenn Sie den AsSequential-Operator entfernen.

Verwandte Themen