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


Útmutató: Egyesítési beállítások megadása a PLINQ-ban

Ez a példa bemutatja, hogyan adhatja meg a PLINQ-lekérdezés összes további operátorára vonatkozó egyesítési beállításokat. Nem kell külön megadnia az egyesítési beállításokat, de ez javíthatja a teljesítményt. Az egyesítési beállításokkal kapcsolatos további információkért lásd: Egyesítési beállítások a PLINQ.

Figyelmeztetés

Ez a példa a használat bemutatására szolgál, és előfordulhat, hogy nem fut gyorsabban, mint az objektumokhoz tartozó, szekvenciális LINQ lekérdezés. További információ a sebességnövelésről, lásd: A gyorsítás megértése a PLINQ.

Példa

Az alábbi példa bemutatja az egyesítési beállítások viselkedését egy olyan alapforgatókönyvben, amely rendezetlen forrással rendelkezik, és minden elemre alkalmaz egy drága függvényt.

namespace MergeOptions
{
    using System;
    using System.Diagnostics;
    using System.Linq;
    using System.Threading;

    class Program
    {
        static void Main(string[] args)
        {

            var nums = Enumerable.Range(1, 10000);

            // Replace NotBuffered with AutoBuffered
            // or FullyBuffered to compare behavior.
            var scanLines = from n in nums.AsParallel()
                                .WithMergeOptions(ParallelMergeOptions.NotBuffered)
                            where n % 2 == 0
                            select ExpensiveFunc(n);

            Stopwatch sw = Stopwatch.StartNew();
            foreach (var line in scanLines)
            {
                Console.WriteLine(line);
            }

            Console.WriteLine($"Elapsed time: {sw.ElapsedMilliseconds} ms. Press any key to exit.");
            Console.ReadKey();
        }

        // A function that demonstrates what a fly
        // sees when it watches television :-)
        static string ExpensiveFunc(int i)
        {
            Thread.SpinWait(2000000);
            return string.Format("{0} *****************************************", i);
        }
    }
}
Class MergeOptions2
    Sub DoMergeOptions()

        Dim nums = Enumerable.Range(1, 10000)

        ' Replace NotBuffered with AutoBuffered
        ' or FullyBuffered to compare behavior.
        Dim scanLines = From n In nums.AsParallel().WithMergeOptions(ParallelMergeOptions.NotBuffered)
                        Where n Mod 2 = 0
                        Select ExpensiveFunc(n)

        Dim sw = Stopwatch.StartNew()
        For Each line In scanLines
            Console.WriteLine(line)
        Next

        Console.WriteLine("Elapsed time: {0} ms. Press any key to exit.")
        Console.ReadKey()

    End Sub
    ' A function that demonstrates what a fly
    ' sees when it watches television :-)
    Function ExpensiveFunc(ByVal i As Integer) As String
        Threading.Thread.SpinWait(2000000)
        Return String.Format("{0} *****************************************", i)
    End Function
End Class

Azokban az esetekben, amikor a AutoBuffered beállítás nemkívánatos késést okoz az első elem bevezetése előtt, próbálkozzon a NotBuffered lehetőséggel, hogy gyorsabban és zökkenőmentesebben adja meg az eredményelemeket.

Lásd még