Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ha egy lekérdezés párhuzamosként fut, a PLINQ particionálja a forrásütemezést, hogy egyszerre több szál is működjön a különböző részeken, általában külön szálakon. Ha az eredményeket egy szálon, például egy foreach (For Each Visual Basic) ciklusban kell felhasználni, akkor az összes szál eredményeit egy sorozatba kell egyesíteni. A PLINQ által végrehajtott egyesítés típusa a lekérdezésben található operátoroktól függ. Az eredményekre új sorrendet előirányzó operátoroknak például az összes szál összes elemét pufferelniük kell. Az alkalmazás felhasználójának szempontjából (amely egyben a fogyasztó szála is) egy teljes mértékben pufferelt lekérdezés észrevehető ideig futhat, mielőtt az első eredményt hozná. A többi operátor alapértelmezés szerint részben pufferelt; kötegekben adnak eredményt. A rendszer alapértelmezés szerint nem pufferel egy operátort ForAll . Az összes szál minden elemét azonnal megjeleníti.
A módszer használatával WithMergeOptions az alábbi példában látható módon megadhat egy tippet a PLINQ-nak, amely jelzi, hogy milyen egyesítést kell végrehajtani.
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)
A teljes példa: Útmutató: Egyesítési beállítások megadása a PLINQ-ban.
Ha az adott lekérdezés nem támogatja a kért beállítást, a rendszer egyszerűen figyelmen kívül hagyja a beállítást. A legtöbb esetben nem kell egyesítési lehetőséget megadnia a PLINQ-lekérdezésekhez. Bizonyos esetekben azonban teszteléssel és méréssel azt tapasztalhatja, hogy egy lekérdezés nem alapértelmezett módban hajtja végre a legjobban. Ennek a lehetőségnek gyakori használata, hogy egy darab-egyesítési operátort arra kényszerítsen, hogy folyamatosan továbbítsa az eredményeket, így reszponzívabb felhasználói felületet biztosítva.
ParallelMergeOptions
Az ParallelMergeOptions enumerálás a következő beállításokat tartalmazza, amelyek a támogatott lekérdezési alakzatok esetében azt határozzák meg, hogy a lekérdezés végső kimenete hogyan alakul, amikor az eredményeket egy szálon használják fel:
Not BufferedA NotBuffered beállítás hatására az egyes feldolgozott elemek azonnal visszakerülnek az egyes szálakból. Ez a viselkedés a kimenet "streameléséhez" hasonló. Ha az AsOrdered operátor megtalálható a lekérdezésben,
NotBufferedmegőrzi a forráselemek sorrendjét. BárNotBufferedamint elérhetőek, elkezd eredményeket eredményezni, az összes eredmény előállításának teljes ideje továbbra is hosszabb lehet, mint a többi egyesítési lehetőség használata.Auto BufferedA AutoBuffered beállítás azt eredményezi, hogy a lekérdezés elemeket gyűjt egy pufferbe, majd meghatározott időközönként egyszerre adja a puffer tartalmát a fogyasztó szálhoz. Ez hasonló ahhoz, hogy a forrásadatokat "adattömbökben" adja meg ahelyett, hogy a "streamelési" viselkedést
NotBufferedhasználjuk.AutoBufferedhosszabb időt vehet igénybe, mintNotBufferedaz első elem elérhetővé tétele a fogyasztó szálon. A puffer mérete és a pontos hozam viselkedése nem konfigurálható, és a lekérdezéshez kapcsolódó különböző tényezőktől függően változhat.FullyBufferedA FullyBuffered beállítás hatására a teljes lekérdezés kimenete pufferelve lesz, mielőtt az elemek bármelyike ki lesz engedve. Ha ezt a beállítást használja, az hosszabb időt is igénybe vehet, amíg az első elem elérhetővé válik a fogyasztószálon, de a teljes eredmények még mindig gyorsabban lesznek létrehozva, mint a többi beállítás használatával.
Az egyesítési beállításokat támogató lekérdezési operátorok
Az alábbi táblázat felsorolja azokat az operátorokat, amelyek támogatják az összes egyesítési mód használatát, a megadott korlátozásokra is figyelemmel.
| Operátor | Korlátozások |
|---|---|
| AsEnumerable | Egyik sem |
| Cast | Egyik sem |
| Concat | Nem rendezett lekérdezések, amelyek csak tömb- vagy listaforrást használnak. |
| DefaultIfEmpty | Egyik sem |
| OfType | Egyik sem |
| Reverse | Nem rendezett lekérdezések, amelyek csak tömb- vagy listaforrást használnak. |
| Select | Egyik sem |
| SelectMany | Egyik sem |
| Skip | Egyik sem |
| Take | Egyik sem |
| Where | Egyik sem |
Az összes többi PLINQ-lekérdezési operátor figyelmen kívül hagyhatja a felhasználó által megadott egyesítési beállításokat. Egyes lekérdezési operátorok például ReverseOrderBynem hozhatnak létre elemeket, amíg az összes nem lett létrehozva és átrendezve. Ezért, ha ParallelMergeOptions olyan lekérdezésben használják, amely olyan operátort is tartalmaz, mint például Reverse, az egyesítési viselkedés csak azután lesz alkalmazva a lekérdezésben, hogy az adott operátor létrehozta az eredményeket.
Egyes operátorok egyesítési beállításainak kezelése a forrásütemezés típusától és attól függ, hogy az AsOrdered operátort korábban használták-e a lekérdezésben. ForAll mindig NotBuffered; azonnal kitermeli az elemeit. OrderBy mindig FullyBuffered; a teljes listát rendeznie kell, mielőtt eredményt adna.