مشاركة عبر


كيفية القيام بما يلي: قم بتحديد خيارات دمج في PLINQ

يوضح هذا المثال كيفية إلى تحديد خيارات الدمج التي سوف تطبق عليك إلى operaإلىrs اللاحقة الجميع في استعلام PLINQ. ليس لديك لتعيين دمج خيارات بشكل واضح، ولكن القيام بذلك قد يؤدي إلى تحسين الأداء. ل المزيد على معلومات حول خيارات الدمج، راجع دمج خيارات في PLINQ.

مثال

يوضح المثال التالي سلوك خيارات دمج في سيناريو أساسي يحتوي على مصدر غير مرتبة وقم بتطبيق دالة مكلفة إلى كل عنصر.

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 = System.Diagnostics.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
        System.Threading.Thread.SpinWait(2000000)
        Return String.Format("{0} *****************************************", i)
    End Function
End Class
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: {0} ms. Press any key to exit.",
                            sw.ElapsedMilliseconds);
            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);
        }
    }
}

في الحالات الموقع AutoBufferedخيار إلى حدوث استتار undesirable قبل العنصر أول هو يسفر، حاول NotBufferedخيار للعائد عناصر النتيجة بشكل أسرع و أكثر سلاسة.

راجع أيضًا:

المبادئ

متوازى LINQ (PLINQ)