Egyesítési beállítások a PLINQ-ban
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. A felhasználó szál szempontjából (amely egyben az alkalmazás felhasználója is) egy teljes mértékben pufferelt lekérdezést futtathat észrevehető ideig, mielőtt az első eredményt hozna. 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 a gyakori használata, ha egy adattömb-egyesítési operátort arra kényszerít, hogy streamelje az eredményeket, hogy rugalmasabb felhasználói felületet biztosítson.
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 Buffered
A 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,
NotBuffered
megőrzi a forráselemek sorrendjét. BárNotBuffered
amint 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 Buffered
Ez AutoBuffered a beállítás azt eredményezi, hogy a lekérdezés elemeket gyűjt egy pufferbe, majd rendszeres időközönként egyszerre adja a puffer tartalmát a fogyasztó szálnak. Ez hasonló ahhoz, hogy a forrásadatokat "adattömbökben" adja meg ahelyett, hogy a "streamelési" viselkedést
NotBuffered
használjuk.AutoBuffered
hosszabb időt vehet igénybe, mintNotBuffered
az 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.FullyBuffered
A 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. ForAllNotBuffered mindig ; azonnal meghozta az elemeit. OrderByFullyBufferedmindig; a teljes listát rendeznie kell, mielőtt az eredményt ad.