Tlačítko Zrušit má běh zastavit. Pokud každá kontrola proxy zachytí zrušení a vrátí se normálně, vnější smyčka prostě přejde na další proxy. Obrazovka pak vypadá, jako by Zrušit nic neudělalo.

V moderním .NET WinForms udržujte jeden zdroj jako pole formuláře a nechte zrušení dojít do obslužné rutiny události:

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 je aplikací už naparsovaný seznam URI proxy. Řádky z seznamu bezplatných proxy mohou napájet povolenou kontrolu veřejného cíle; zachovejte protokol a používejte jen typy, které tato obsluha podporuje. UI čeká na každou operaci, takže smyčka zpráv zůstává volná pro přijetí kliknutí na zrušení.

Přeneste token do sítě

Individuální kontrola musí tento token přijmout. Zkrácená HTTP kontrola může vypadat takto:

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 a RecordResult patří stávajícímu kontroloru. Udržujte přiměřený limit velikosti odpovědi a časový limit pro tento koncový bod. Produkční kontrolor může znovu používat klienty podle trasy; úryvek ukazuje, kudy zrušení putuje, ne návrh poolu připojení.

Pokud mají být neúspěšné proxy zaznamenány a přeskočeny, zachyťte očekávané síťové chyby kolem individuální kontroly. Nechte zrušení běhu uniknout do vnější obsluhy. Pro paralelní kontroly sdílejte token běhu se všemi pracovníky a před povolením dalšího běhu počkejte na jejich dokončení.

Související články