Freigeben über


Vorgehensweise: Festlegen von Zusammenführungsoptionen in PLINQ

In diesem Beispiel wird gezeigt, wie Die Zusammenführungsoptionen angegeben werden, die für alle nachfolgenden Operatoren in einer PLINQ-Abfrage gelten. Sie müssen die Zusammenführungsoptionen nicht explizit festlegen, dies kann jedoch die Leistung verbessern. Weitere Informationen zu Zusammenführungsoptionen finden Sie unter Zusammenführungsoptionen in PLINQ.

Warnung

Dieses Beispiel soll die Verwendung veranschaulichen und kann nicht schneller als die entsprechende sequenzielle LINQ to Objects-Abfrage ausgeführt werden. Weitere Informationen zur Beschleunigung finden Sie unter Understanding Speedup in PLINQ.

Beispiel

Das folgende Beispiel veranschaulicht das Verhalten von Zusammenführungsoptionen in einem einfachen Szenario, das über eine nicht sortierte Quelle verfügt und eine teure Funktion auf jedes Element anwendet.

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

In Fällen, in denen die AutoBuffered Option zu einer unerwünschten Latenz führt, bevor das erste Element zurückgegeben wird, versuchen Sie die NotBuffered Option, um Ergebniselemente schneller und reibungsloser bereitzustellen.

Siehe auch