Annuller-knappen skal stoppe kørslen. Hvis hvert proxy-tjek fanger annulleringen og vender normalt tilbage, går den ydre løkke blot videre til næste proxy. Så ser skærmen ud, som om Annuller ikke gjorde noget.

I moderne .NET WinForms skal du beholde én kilde som et formularfelt og lade annulleringen nå hændelseshåndteringen:

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 er programmets allerede parsede liste over proxy-URI'er. Rækker fra listen over gratis proxyer kan føde et tilladt offentligt mål-tjek; bevar protokollen, og brug kun typer, som denne håndtering understøtter. UI'en afventer hver handling, så beskedløkken forbliver fri til at modtage annulleringsklikket.

Før tokenet til netværket

Det enkelte tjek skal acceptere dette token. Et forkortet HTTP-tjek kan se sådan ud:

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 og RecordResult tilhører den eksisterende checker. Behold en passende grænse for svarets størrelse og en timeout til dette endepunkt. En produktionschecker kan genbruge klienter pr. rute; uddraget viser, hvor annulleringen rejser hen, ikke et forbindelsespool-design.

Hvis mislykkede proxyer skal registreres og springes over, skal du fange forventede netværksfejl omkring det enkelte tjek. Lad kørslens annullering undslippe til den ydre håndtering. Ved parallelle tjek skal du dele kørselstokenet med hver arbejder og afvente deres afslutning, før en ny kørsel aktiveres.

Relaterede artikler