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 ธรรมดา ที่อยู่ขาออกเป็นการสังเกตอีกอย่างทางฝั่งปลายทาง แยกจากทางเข้าที่กำหนดไว้

งานที่มีขีดจำกัดป้องกันไม่ให้ผู้ตรวจใช้ซ็อกเก็ต หน่วยความจำ หรือตัวจัดตารางเวลาของตัวเองจนหมดก่อนจะประเมินเส้นทางได้ ผลลัพธ์แบบเป็นขั้นยังมีประโยชน์ต่อนโยบายการคัดเลือกโดยไม่แสร้งว่าปลายทางที่สำเร็จหนึ่งแห่งทำให้ปลายทางดีทั่วทุกกรณี

บทความที่เกี่ยวข้อง