مشاركة عبر


دمج خيارات في PLINQ

عند الاستعلام هو تنفيذها جنبا إلى جنب، أقسام PLINQ التسلسل المصدر بحيث يمكن أن تعمل مؤشرات ترابط متعددة تشغيل أجزاء مختلفة بشكل متزامن، عادة في فصل مؤشرات الترابط. إذا كانت نتائج إلى يمكن استهلاكها تشغيل مؤشر ترابط واحد، تشغيل سبيل المثال، في تكرار حلقي foreach(For EachinVisual Basic) ، ثم دمج نتائج من كل مؤشر ترابط في إلى تسلسل واحد. يعتمد نوع الدمج الذي يجري PLINQ تشغيل العوامل التي موجود في الاستعلام. ل مثال، يجب أن احتياطي للمشغلات التي تفرض طلب جديد تشغيل نتائج الجميع العناصر من الجميع عمليات جزئية. من منظور مؤشر ترابط مضيعة (الذي هو أيضا تلك الخاصة بمستخدم تطبيق) قد تشغيل استعلام كامل مخزنة بشكل مؤقت لفترة زمنية قبل فإنها تعطي ناتجها الأولى يمكن ملاحظته. غير ذلك العوامل، بشكل افتراضي، يتم جزئيا مؤقتاً؛ أنها ذا الخاصة بها على دفعات. عامل تشغيل، ForAll()هو عدم تخزينها مؤقتاً بشكل افتراضي. تعطي الجميع عناصر من الجميع عمليات جزئية على الفور.

باستخدام WithParallelMergeOptions()الأسلوب، كـ هو موضح في المثال التالي، يمكنك توفير تلميح إلى PLINQ الذي يشير إلى نوع الدمج لتنفيذ.

        Dim scanlines = From n In nums.AsParallel().WithMergeOptions(ParallelMergeOptions.NotBuffered)
                        Where n Mod 2 = 0
                        Select ExpensiveFunc(n)

var scanLines = from n in nums.AsParallel()
                    .WithMergeOptions(ParallelMergeOptions.NotBuffered)
                where n % 2 == 0
                select ExpensiveFunc(n);

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

إذا كان الاستعلام المحدد لا دعم خيار المطلوب، ثم خيار سيتم فقط تجاهل. في معظم الحالات، لم يكن إلى قم بتحديد أحد خيارات دمج لاستعلام PLINQ. ومع ذلك، في بعض الحالات قد تجد باختبار و القياس الذي يقوم بتنفيذ استعلام الأمثل في الوضع غير افتراضي. عامة استخدم هذا خيار هو لفرض عامل الدمج على المجموعة لدفق نتائجه إلى لتوفر واجهة استخدم r أكثر استجابة.

ParallelMergeOptions

ParallelMergeOptionsيتضمن القائمة تعداد الخيارات التالية التي تحدد كيفية النهائية إخراج الاستعلام الاستعلام المعتمدة الأشكال، هو يسفر عندما يتم استهلاكه نتائج تشغيل مؤشر ترابط واحد:

  • Not Buffered

    NotBufferedيسبب خيار كل عنصر معالجة يتم إرجاعها من كل مؤشر ترابط مجرد هو إنتاجها. Th هو سلوك هو مماثل للإخراج "دفق". إذا AsOrdered()العامل هو الموجودة في الاستعلام، NotBufferedيحافظ على ترتيب العناصر المصدر. على الرغم من أن NotBufferedيبدأ في الحصول على نتائج بمجرد أن تكون متوفرة, أن الوقت الإجمالي لإنتاج الجميع نتائج التي قد لا تزال أكثر من استخدام واحد غير ذلك دمج الخيارات.

  • Auto Buffered

    AutoBufferedيسبب خيار استعلام تجميع عناصر إلى مخزن مؤقت و ثم العائد محتويات احتياطي في نفس الوقت إلى مؤشر ترابط مضيعة. دورياً Th هو هو مماثل للحصول بيانات المصدر في "مجموعات" بدلاً من استخدام "دفق" سلوك NotBuffered. AutoBufferedقد تستغرق وقتاً أطول منNotBufferedإلى توفير العنصر أول تشغيل مؤشر ترابط مضيعة. الحجم احتياطي وسلوك yielding الدقيق غير قابلة للتكوين وقد تختلف, اعتماداً تشغيل facإلىrs المتنوعة التي تتعلق إلى الاستعلام.

  • FullyBuffered

    FullyBufferedخيار يؤدي إلى إخراج الاستعلام الكامل يجب تخزينها مؤقتاً قبل أي من عناصر يتم يسفر. عند استخدام ترتيب هو خيار، فإنه يستغرق وقتاً أطول قبل العنصر أول هو على مؤشر ترابط كبيرا، ولكن النتائج كاملة قد لا يزال يتم إنتاج أسرع من باستخدام خيارات الأخرى.

استعلام العوامل التي دعم دمج خيارات

يسرد الجدول التالي operaإلىrs التي تدعم الجميع الأوضاع خيار دمج الموضوع إلى قيود معينة.

العامل

Restrictions (تقييدات)

AsEnumerable

لا يوجد

Cast

لا يوجد

Concat

استعلامات طلبها بعدم التي تحتوي قائمة أو صفيفة مصدر فقط.

DefaultIfEmpty

لا يوجد

OfType

لا يوجد

Reverse

استعلامات طلبها بعدم التي تحتوي قائمة أو صفيفة مصدر فقط.

تحديد

لا يوجد

SelectMany

لا يوجد

تخطي

لا يوجد

take

لا يوجد

حيث يكون

لا يوجد

الجميع PLINQ استعلام قد تجاهل العوامل خيارات دمج المتوفرة من قبل مستخدم. بعض استعلام عوامل تشغيل، على سبيل المثال، Reverse()و OrderBy، لا يمكن أن العائد على أي عناصر حتى الجميع يتم إنتاجها وإعادة ترتيب. ولذلك، عندما ParallelMergeOptionsهو المستخدمة في استعلام الذي يحتوي على عامل تشغيل مثل Reverse()، لن تطبق سلوك الدمج في الاستعلام حتى بعد أن تم إنتاج هذا العامل نتائج الخاصة بها.

القدرة تشغيل بعض عوامل تشغيل لمعالجة خيارات دمج يعتمد تشغيل نوع تسلسل المصدر، وما إذا كان AsOrdered()تم استخدام عامل التشغيل في الاستعلام.

ForAll()هو دوماًNotBuffered; تعطي عناصره مباشرة. OrderByيتم دوماًFullyBuffered؛ يجب فرز القائمة بأكملها قبل محصول.

راجع أيضًا:

المهام

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

المبادئ

متوازى LINQ (PLINQ)