Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn eine Abfrage parallel ausgeführt wird, partitioniert PLINQ die Quellsequenz, sodass mehrere Threads gleichzeitig an verschiedenen Teilen arbeiten können, in der Regel in separaten Threads. Wenn die Ergebnisse in einem Thread verwendet werden sollen, z. B. in einer foreach
(For Each
in Visual Basic)-Schleife, müssen die Ergebnisse aus jedem Thread wieder in eine Sequenz zusammengeführt werden. Die Art der Zusammenführung, die PLINQ ausführt, hängt von den Operatoren ab, die in der Abfrage vorhanden sind. Beispielsweise müssen Operatoren, die eine neue Reihenfolge für die Ergebnisse auferlegen, alle Elemente aus allen Threads puffern. Aus Sicht des verbrauchenden Threads (auch des Anwendungsbenutzers) kann eine vollständig gepufferte Abfrage für einen spürbaren Zeitraum ausgeführt werden, bevor es das erste Ergebnis erzeugt. Andere Operatoren sind standardmäßig teilweise gepuffert; sie liefern ihre Ergebnisse in Batches. Der Operator ForAll ist standardmäßig nicht gepuffert. Es liefert alle Elemente aus allen Threads sofort.
Mithilfe der WithMergeOptions Methode, wie im folgenden Beispiel gezeigt, können Sie einen Hinweis auf PLINQ bereitstellen, der angibt, welche Art von Zusammenführung ausgeführt werden soll.
var scanLines = from n in nums.AsParallel()
.WithMergeOptions(ParallelMergeOptions.NotBuffered)
where n % 2 == 0
select ExpensiveFunc(n);
Dim scanlines = From n In nums.AsParallel().WithMergeOptions(ParallelMergeOptions.NotBuffered)
Where n Mod 2 = 0
Select ExpensiveFunc(n)
Das vollständige Beispiel finden Sie unter How to: Specify Merge Options in PLINQ.
Wenn die angegebene Abfrage die angeforderte Option nicht unterstützen kann, wird die Option nur ignoriert. In den meisten Fällen müssen Sie keine Zusammenführungsoption für eine PLINQ-Abfrage angeben. In einigen Fällen können Sie jedoch feststellen, dass eine Abfrage in einem nicht standardmäßigen Modus am besten ausgeführt wird. Eine häufige Verwendung dieser Option besteht darin, zu erzwingen, dass ein Blockzusammenführungsoperator seine Ergebnisse streamt, um eine reaktionsfähigere Benutzeroberfläche bereitzustellen.
ParallelMergeOptions
Die ParallelMergeOptions Enumeration umfasst die folgenden Optionen, die angeben, wie bei unterstützten Abfrageformen die endgültige Ausgabe der Abfrage erzeugt wird, wenn die Ergebnisse in einem Thread verarbeitet werden.
Not Buffered
Die NotBuffered Option bewirkt, dass jedes verarbeitete Element von jedem Thread zurückgegeben wird, sobald es erstellt wird. Dieses Verhalten entspricht dem "Streamen" der Ausgabe. Wenn der AsOrdered Operator in der Abfrage vorhanden ist,
NotBuffered
bleibt die Reihenfolge der Quellelemente erhalten. ObwohlNotBuffered
die Ergebniserreichung beginnt, sobald sie verfügbar sind, ist die Gesamtzeit für die Erstellung aller Ergebnisse möglicherweise noch länger als die Verwendung einer der anderen Zusammenführungsoptionen.Auto Buffered
Die AutoBuffered Option bewirkt, dass die Abfrage Elemente in einem Puffer sammelt und dann in regelmäßigen Abständen den Pufferinhalt für den verbrauchten Thread zurückgibt. Dies entspricht dem Generieren der Quelldaten in "Blöcken" anstelle des "Streaming"-Verhaltens von
NotBuffered
.AutoBuffered
benötigt möglicherweise mehr Zeit alsNotBuffered
, um das erste Element für den verarbeitenden Thread verfügbar zu machen. Die Größe des Puffers und das genaue Ertragsverhalten sind nicht konfigurierbar und können je nach verschiedenen Faktoren variieren, die sich auf die Abfrage beziehen.FullyBuffered
Die FullyBuffered Option bewirkt, dass die Ausgabe der gesamten Abfrage gepuffert wird, bevor eines der Elemente zurückgegeben wird. Wenn Sie diese Option verwenden, kann es länger dauern, bis das erste Element im verbrauchten Thread verfügbar ist, aber die vollständigen Ergebnisse können immer noch schneller erstellt werden als durch die Verwendung der anderen Optionen.
Abfrageoperatoren, die Zusammenführungsoptionen unterstützen
In der folgenden Tabelle sind die Operatoren aufgeführt, die alle Zusammenführungsoptionsmodi unterstützen, vorbehaltlich der angegebenen Einschränkungen.
Bediener | Einschränkungen |
---|---|
AsEnumerable | Nichts |
Cast | Nichts |
Concat | Nicht sortierte Abfragen, die nur über eine Matrix- oder Listenquelle verfügen. |
DefaultIfEmpty | Nichts |
OfType | Nichts |
Reverse | Nicht sortierte Abfragen, die nur über eine Matrix- oder Listenquelle verfügen. |
Select | Nichts |
SelectMany | Nichts |
Skip | Nichts |
Take | Nichts |
Where | Nichts |
Alle anderen PLINQ-Abfrageoperatoren ignorieren möglicherweise vom Benutzer bereitgestellte Zusammenführungsoptionen. Einige Abfrageoperatoren, wie zum Beispiel Reverse und OrderBy, können keine Elemente liefern, bis alle erstellt und neu angeordnet wurden. Daher, wenn ParallelMergeOptions in einer Abfrage verwendet wird, die auch einen Operator wie Reverse enthält, wird das Zusammenführungsverhalten erst dann in der Abfrage angewendet, nachdem dieser Operator seine Ergebnisse erzeugt hat.
Die Fähigkeit einiger Operatoren zum Behandeln von Zusammenführungsoptionen hängt vom Typ der Quellsequenz und davon ab, ob der AsOrdered Operator früher in der Abfrage verwendet wurde. ForAll ist immer NotBuffered ; es liefert seine Elemente sofort. OrderBy ist immer FullyBuffered; es muss die gesamte Liste sortieren, bevor es Ergebnisse liefert.