Butonul Anulează ar trebui să oprească rularea. Dacă fiecare verificare de proxy prinde anularea și revine normal, bucla exterioară trece pur și simplu la următorul proxy. Atunci ecranul arată ca și cum Anulează nu a făcut nimic.

În WinForms .NET modern, păstrați o singură sursă ca câmp de formular și lăsați anularea să ajungă la handlerul de evenimente:

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 este lista de URI-uri de proxy deja analizată de aplicație. Rândurile din lista de proxy-uri gratuite pot alimenta o verificare permisă a unei ținte publice; păstrați protocolul și folosiți doar tipurile acceptate de acest handler. Interfața așteaptă fiecare operație, așa că bucla de mesaje rămâne liberă să primească clicul de anulare.

Duceți tokenul până la rețea

Verificarea individuală trebuie să accepte acel token. O verificare HTTP prescurtată poate arăta astfel:

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 și RecordResult aparțin verificatorului existent. Păstrați o limită adecvată a dimensiunii răspunsului și un timeout pentru acest endpoint. Un verificator de producție poate reutiliza clienți pe rută; fragmentul arată pe unde călătorește anularea, nu un design de pool de conexiuni.

Dacă proxy-urile eșuate trebuie înregistrate și sărite, prindeți erorile de rețea așteptate în jurul verificării individuale. Lăsați anularea rulării să scape către handlerul exterior. Pentru verificări paralele, partajați tokenul rulării cu fiecare lucrător și așteptați finalizarea lor înainte de a activa altă rulare.

Articole similare