Dela via


Kopplingsalternativ i PLINQ

När en fråga körs som parallell partitionerar PLINQ källsekvensen så att flera trådar kan fungera på olika delar samtidigt, vanligtvis på separata trådar. Om resultatet ska förbrukas i en tråd, till exempel i en foreach (For Each i Visual Basic)-loop, måste resultatet från varje tråd sammanfogas tillbaka till en sekvens. Vilken typ av sammanslagning som PLINQ utför beror på de operatorer som finns i frågan. Operatorer som till exempel lägger en ny ordning på resultaten måste buffra alla element från alla trådar. Ur den förbrukande trådens perspektiv (vilket också är programanvändarens) kan en fullständigt buffrad fråga köras under en märkbar tidsperiod innan den ger sitt första resultat. Andra operatorer är som standard delvis buffrade. de ger sina resultat i batchar. En operator ForAll är inte buffrad som standard. Det ger alla element från alla trådar omedelbart.

Med hjälp WithMergeOptions av metoden, som du ser i följande exempel, kan du ge ett tips till PLINQ som anger vilken typ av sammanslagning som ska utföras.

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)

Det fullständiga exemplet finns i How to: Specify Merge Options in PLINQ (Så här anger du kopplingsalternativ i PLINQ).

Om den specifika frågan inte stöder det begärda alternativet ignoreras bara alternativet. I de flesta fall behöver du inte ange ett kopplingsalternativ för en PLINQ-fråga. I vissa fall kan du dock genom att testa och mäta att en fråga körs bäst i ett icke-standardläge. En vanlig användning av det här alternativet är att tvinga en segmentsammanslagningens operator att strömma sina resultat för att tillhandahålla ett mer dynamiskt användargränssnitt.

ParallelMergeOptions

Uppräkningen ParallelMergeOptions innehåller följande alternativ som för frågeformer som stöds anger hur frågans slutliga utdata returneras när resultatet förbrukas i en tråd:

  • Not Buffered

    Alternativet NotBuffered gör att varje bearbetat element returneras från varje tråd så snart det skapas. Det här beteendet motsvarar "strömmande" utdata. Om operatorn AsOrdered finns i frågan NotBuffered bevaras ordningen på källelementen. Även om NotBuffered börjar ge resultat så snart de är tillgängliga, kan den totala tiden för att producera alla resultat fortfarande vara längre än att använda något av de andra sammanslagningsalternativen.

  • Auto Buffered

    Alternativet AutoBuffered gör att frågan samlar in element i en buffert och sedan regelbundet ger buffertinnehållet allt på en gång till den förbrukande tråden. Detta motsvarar att ge källdata i "segment" i stället för att använda beteendet "strömning" för NotBuffered. AutoBuffered kan ta längre tid än NotBuffered att göra det första elementet tillgängligt i den förbrukande tråden. Buffertens storlek och det exakta avkastningsbeteendet kan inte konfigureras och kan variera beroende på olika faktorer som är relaterade till frågan.

  • FullyBuffered

    Alternativet FullyBuffered gör att utdata från hela frågan buffrades innan något av elementen returneras. När du använder det här alternativet kan det ta längre tid innan det första elementet är tillgängligt i den förbrukande tråden, men de fullständiga resultaten kan fortfarande genereras snabbare än med hjälp av de andra alternativen.

Frågeoperatorer som stöder kopplingsalternativ

I följande tabell visas de operatorer som stöder alla kopplingsalternativlägen, med de angivna begränsningarna.

Operator Begränsningar
AsEnumerable Ingen
Cast Ingen
Concat Icke-ordnade frågor som endast har en matris eller listkälla.
DefaultIfEmpty Ingen
OfType Ingen
Reverse Icke-ordnade frågor som endast har en matris eller listkälla.
Select Ingen
SelectMany Inga
Skip Inga
Take Inga
Where Ingen

Alla andra PLINQ-frågeoperatorer kan ignorera kopplingsalternativ som tillhandahålls av användaren. Vissa frågeoperatorer, Reverse till exempel och OrderBy, kan inte ge några element förrän alla har skapats och ordnats om. ParallelMergeOptions När används i en fråga som också innehåller en operator, till exempel Reverse, tillämpas därför inte sammanslagningsbeteendet i frågan förrän efter att operatorn har genererat sina resultat.

Möjligheten för vissa operatorer att hantera kopplingsalternativ beror på typen av källsekvens och om operatorn AsOrdered användes tidigare i frågan. ForAll är alltid NotBuffered ; det ger sina element omedelbart. OrderBy är alltid FullyBuffered; den måste sortera hela listan innan den ger.

Se även