Nút Hủy phải dừng lượt chạy. Nếu mỗi lần kiểm tra proxy bắt được hủy và quay lại bình thường, vòng lặp ngoài chỉ chuyển sang proxy tiếp theo. Màn hình khi đó trông như thể Hủy không làm gì cả.

Trong .NET WinForms hiện đại, giữ một nguồn làm trường của biểu mẫu và để hủy đến được trình xử lý sự kiện:

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 là danh sách URI proxy mà ứng dụng đã phân tích. Các hàng từ danh sách proxy miễn phí có thể cấp dữ liệu cho một lần kiểm tra mục tiêu công khai được phép; giữ nguyên giao thức và chỉ dùng các kiểu mà trình xử lý này hỗ trợ. Giao diện chờ từng thao tác, nên vòng lặp thông điệp vẫn rảnh để nhận cú nhấp hủy.

Mang token đến mạng

Lần kiểm tra riêng lẻ phải chấp nhận token đó. Một lần kiểm tra HTTP rút gọn có thể trông như sau:

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 và RecordResult thuộc về bộ kiểm tra hiện có. Giữ giới hạn kích thước phản hồi phù hợp và thời gian chờ cho điểm cuối này. Bộ kiểm tra sản xuất có thể dùng lại máy khách theo tuyến; đoạn mã cho thấy hủy đi đến đâu, không phải thiết kế bể kết nối.

Nếu proxy thất bại cần được ghi lại và bỏ qua, hãy bắt các lỗi mạng dự kiến quanh lần kiểm tra riêng lẻ. Để hủy của lượt chạy thoát ra trình xử lý bên ngoài. Với kiểm tra song song, chia sẻ token của lượt chạy với mọi worker và chờ chúng hoàn tất trước khi bật lượt chạy khác.

Bài viết liên quan