ยกเลิกการรันตรวจสอบพร็อกซี WinForms ทั้งหมด
เก็บแหล่งยกเลิกเดียวสำหรับการรันตรวจสอบพร็อกซี WinForms ส่งต่อการยกเลิกผ่านงาน HTTP และหยุดการเลื่อนรายการ
ปุ่มยกเลิกควรหยุดการรัน ถ้าการตรวจสอบพร็อกซีแต่ละครั้งจับการยกเลิกแล้วกลับมาปกติ ลูปชั้นนอกก็เพียงเลื่อนไปพร็อกซีถัดไป หน้าจอจึงดูเหมือนการยกเลิกไม่ได้ทำอะไรเลย
ใน .NET WinForms สมัยใหม่ ให้เก็บแหล่งเดียวเป็นฟิลด์ของฟอร์มและปล่อยให้การยกเลิกไปถึงตัวจัดการเหตุการณ์:
private CancellationTokenSource? activeRun;
private async void startButton_Click(object sender, EventArgs e)
{
if (activeRun is not null) return;
using var run = new CancellationTokenSource();
activeRun = run;
startButton.Enabled = false;
try
{
foreach (Uri proxy in configuredProxies)
{
run.Token.ThrowIfCancellationRequested();
await CheckProxyAsync(proxy, run.Token);
}
statusLabel.Text = "Finished";
}
catch (OperationCanceledException) when (run.IsCancellationRequested)
{
statusLabel.Text = "Stopped";
}
finally
{
activeRun = null;
startButton.Enabled = true;
}
}
private void cancelButton_Click(object sender, EventArgs e)
=> activeRun?.Cancel();configuredProxies คือรายการ URI พร็อกซีที่แอปแยกวิเคราะห์ไว้แล้ว แถวจากรายการพร็อกซีฟรีสามารถป้อนการตรวจสอบเป้าหมายสาธารณะที่ได้รับอนุญาตได้ รักษาโปรโตคอลและใช้เฉพาะชนิดที่ตัวจัดการนี้รองรับ UI รอทุกOperation ดังนั้นลูปข้อความยังว่างที่จะรับคลิกยกเลิก
ส่งโทเค็นไปยังเครือข่าย
การตรวจสอบแต่ละครั้งต้องยอมรับโทเค็นนั้น การตรวจสอบ HTTP แบบย่ออาจมีลักษณะดังนี้:
private async Task CheckProxyAsync(Uri proxy, CancellationToken token)
{
using var handler = new HttpClientHandler
{
Proxy = new System.Net.WebProxy(proxy),
UseProxy = true
};
using var client = new HttpClient(handler);
using var response = await client.GetAsync(
probeUri, HttpCompletionOption.ResponseHeadersRead, token);
response.EnsureSuccessStatusCode();
string body = await response.Content.ReadAsStringAsync(token);
RecordResult(proxy, body);
}probeUri และ RecordResult เป็นของตัวตรวจสอบที่มีอยู่ รักษาขีดจำกัดขนาดคำตอบที่เหมาะสมและเวลาหมดเวลาสำหรับปลายทางนี้ ตัวตรวจสอบสำหรับใช้งานจริงสามารถใช้ไคลเอนต์ซ้ำตามเส้นทางได้ ตัวอย่างแสดงว่าการยกเลิกเดินทางไปที่ใด ไม่ใช่การออกแบบพูลการเชื่อมต่อ
หากต้องบันทึกและข้ามพร็อกซีที่ล้มเหลว ให้จับความล้มเหลวของเครือข่ายที่คาดไว้รอบการตรวจสอบแต่ละครั้ง ปล่อยให้การยกเลิกของการรันหลุดออกไปยังตัวจัดการชั้นนอก สำหรับการตรวจสอบแบบขนาน ให้แชร์โทเค็นการรันกับผู้ปฏิบัติงานทุกคนและรอให้เสร็จก่อนเปิดการรันอื่น