Megosztás a következőn keresztül:


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ár NotBuffered 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 NotBufferedhasználjuk. AutoBuffered hosszabb időt vehet igénybe, mint NotBuffered 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.

Lásd még