Tombol Batal harus menghentikan proses. Jika setiap pemeriksaan proxy menangkap pembatalan dan kembali normal, loop luar hanya melanjutkan ke proxy berikutnya. Layar kemudian tampak seolah Batal tidak melakukan apa pun.

Di .NET WinForms modern, pertahankan satu sumber sebagai field formulir dan biarkan pembatalan mencapai penangan peristiwa:

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 adalah daftar URI proxy yang sudah diuraikan aplikasi. Baris dari daftar proxy gratis dapat memberi masukan bagi pemeriksaan target publik yang diizinkan; pertahankan protokol dan gunakan hanya tipe yang didukung penangan ini. UI menunggu setiap operasi, sehingga loop pesan tetap bebas menerima klik batal.

Bawa token ke jaringan

Pemeriksaan individual harus menerima token itu. Pemeriksaan HTTP yang disingkat dapat terlihat seperti ini:

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 dan RecordResult milik pemeriksa yang sudah ada. Pertahankan batas ukuran respons yang sesuai dan batas waktu untuk endpoint ini. Pemeriksa produksi dapat menggunakan ulang klien per rute; fragmen menunjukkan ke mana pembatalan bergerak, bukan desain kumpulan koneksi.

Jika proxy yang gagal harus dicatat dan dilewati, tangkap kegagalan jaringan yang diharapkan di sekitar pemeriksaan individual. Biarkan pembatalan proses lolos ke penangan luar. Untuk pemeriksaan paralel, bagikan token proses ke setiap pekerja dan tunggu penyelesaiannya sebelum mengaktifkan proses lain.

Artikel terkait