var options = new ParallelOptions
{
    MaxDegreeOfParallelism = 8,
    CancellationToken = cancellationToken
};
await Parallel.ForEachAsync(endpoints, options,
    async (endpoint, token) =>
    {
        var result = await ProbeAsync(endpoint, target, token);
        observations.Add(result);
    });

استخدم مجموعة عمّال محدودة بدل إطلاق مهمة لكل نقطة نهاية. في الفحوص التي تُجرى على أهداف عامة مسموح بها، توفّر قائمة الوكلاء المجانية صفوفًا مرشحة؛ وحافظ على بروتوكول كل إدخال عند بناء الفحص. يفترض مقطع الجدولة هذا، المكتوب بـ .NET، وجود ProbeAsync يدرك الوكيل، وجامع observations آمن للخيوط. الرقم ثمانية حدّ توضيحي، وليس قيمة مثلى مقيسة. ولا يزال الفحص بحاجة إلى حدود لكل محاولة وإلى إلغاء للمهمة بأكملها.

احتفظ بكل نتيجة مكتملة مقترنة بمدخلاتها حتى لو اختلف ترتيب الاكتمال. سجّل البروتوكول ونقطة النهاية والهدف والطريقة والزمن المنقضي والنتيجة. إن فشل الاتصال ورفض تسجيل الدخول إلى الوكيل ورفض CONNECT وتلقّي استجابة من الموقع كلها ملاحظات مختلفة.

فتح منفذ TCP لا يثبت التفاوض مع الوكيل. كما أن جلب عنوان الوكيل كموقع ويب يختلف عن استخدامه لطلب الهدف.

اختر الهدف والطريقة بحسب القدرة المطلوبة. قد يوفّر HEAD حركة الجسم لكنه لا يثبت أن GET يعيد محتوى مفيدًا؛ فقد يرفض موقع إحداهما ويسمح بالأخرى. ويضيف HTTPS تفاوض CONNECT وTLS الوجهة الغائبين عن HTTP العادي. عنوان الخروج ملاحظة أخرى من جهة الوجهة، منفصلة عن المدخل المُعدّ.

يبقي العمل المحدود المدقّق من استنزاف مقابسه أو ذاكرته أو مجدوله قبل أن يتمكن من تقييم المسار. وتبقى النتيجة المرحلية مفيدة لسياسة الاختيار من دون أن توحي بأن نجاح وجهة واحدة يجعل نقطة النهاية جيدة في كل الحالات.

مقالات ذات صلة