Avbryt-knappen skal stoppe kjøringen. Hvis hver proxykontroll fanger avbrytelsen og returnerer normalt, går den ytre løkken bare videre til neste proxy. Da ser skjermen ut som om Avbryt ikke gjorde noe.

I moderne .NET WinForms holder du én kilde som et skjemafelt og lar avbrytelsen nå hendelsesbehandleren:

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. Rader fra listen over gratis proxyer kan mate en tillatt kontroll av et offentlig mål; behold protokollen og bruk bare typer som denne behandleren støtter. UI-en venter på hver operasjon, så meldingsløkken forblir ledig for å motta avbryt-klikket.

Før tokenet til nettverket

Den enkelte kontrollen må godta dette tokenet. En forkortet HTTP-kontroll kan se slik ut:

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 kontrolløren. Behold en passende grense for svarets størrelse og en tidsavbrudd for dette endepunktet. En produksjonskontrollør kan gjenbruke klienter per rute; utdraget viser hvor avbrytelsen reiser, ikke et tilkoblingspool-design.

Hvis mislykkede proxyer skal registreres og hoppes over, må du fange forventede nettverksfeil rundt den enkelte kontrollen. La avbrytelsen av kjøringen slippe ut til den ytre behandleren. For parallelle kontroller deler du kjøringstokenet med hver arbeider og venter på at de fullfører før en ny kjøring aktiveres.

Relaterte artikler