หยุดบล็อก WinForms ขณะที่การตรวจสอบ proxy กำลังทำงาน
แทนที่ Task.WaitAll แบบ synchronous ใน UI event handler ด้วยแบตช์ที่รอและมีขอบเขต จากนั้นอัปเดตคอนโทรลใน UI context ที่กลับมา
Task.WaitAll ใน WinForms click handler บล็อกหน้าต่างแม้การตรวจสอบเองจะใช้ HTTP แบบ asynchronous UI thread ไม่สามารถประมวลผลข้อความได้ และ continuation ที่ถูกจับไว้อาจต้องใช้ thread ที่ถูกบล็อกเดียวกัน
สำหรับ .NET 6 หรือใหม่กว่า ให้ await แบตช์ที่มีขอบเขตแทน:
private async void checkButton_Click(object sender, EventArgs e)
{
checkButton.Enabled = false;
try
{
var entries = proxyList.Lines
.Where(line => !string.IsNullOrWhiteSpace(line));
foreach (var batch in entries.Chunk(8))
{
var results = await Task.WhenAll(batch.Select(CheckProxyAsync));
ShowResults(results);
}
}
catch (Exception error)
{
ShowCheckError(error);
}
finally
{
checkButton.Enabled = true;
}
}สิ่งนี้อยู่ในฟอร์มที่มีอยู่ซึ่งมี System.Linq และ System.Threading.Tasks พร้อมใช้งาน CheckProxyAsync ทำอินพุตและเอาต์พุตแบบ asynchronous ที่มีขอบเขตและคืนผลลัพธ์หนึ่งรายการ มันไม่จัดการคอนโทรลจาก background thread ShowResults และ ShowCheckError เป็นเมธอดของแอปพลิเคชัน
continuation ปกติของ await กลับไปยัง UI context ที่ handler เริ่มต้น ดังนั้น ShowResults จึงอัปเดตคอนโทรลได้ โค้ดที่ทำงานบน thread อื่นอย่างชัดเจนต้องส่งต่อการเข้าถึงคอนโทรลผ่านกลไก WinForms ที่รองรับ
รายการ proxy ฟรี สามารถให้ที่อยู่ขาเข้าได้ ส่งเฉพาะโปรโตคอลที่ CheckProxyAsync รองรับ แปดคืองบประมาณตัวอย่าง แบตช์ถัดไปรอการตรวจสอบที่ช้าที่สุดในแบตช์ปัจจุบัน แลก throughput บางส่วนกับการสร้าง task ที่มีขอบเขต เก็บกำหนดเวลาของแต่ละการตรวจสอบและ cancellation ไว้ใน CheckProxyAsync การ await แบตช์ไม่สามารถทำให้การดำเนินการเครือข่ายที่ไม่มีขอบเขตเสร็จสิ้นได้