Dugme Otkaži treba da zaustavi pokretanje. Ako svaka provera proksija uhvati otkazivanje i vrati se normalno, spoljna petlja jednostavno prelazi na sledeći proksi. Tada ekran izgleda kao da Otkaži nije učinio ništa.

U modernom .NET WinForms držite jedan izvor kao polje forme i pustite otkazivanje do rukovaoca događaja:

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 već parsirana lista proksi URI-jeva u aplikaciji. Redovi iz liste besplatnih proksija mogu hraniti dozvoljenu proveru javnog cilja; zadržite protokol i koristite samo tipove koje ovaj rukovalac podržava. UI čeka svaku operaciju, pa petlja poruka ostaje slobodna da primi klik otkazivanja.

Prenesite token do mreže

Pojedinačna provera mora prihvatiti taj token. Skraćena HTTP provera može izgledati ovako:

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 pripadaju postojećem proverivaču. Održavajte odgovarajuće ograničenje veličine odgovora i tajm-aut za taj endpoint. Produkcijski proverivač može ponovo koristiti klijente po ruti; isečak pokazuje kuda otkazivanje putuje, a ne dizajn pula veza.

Ako neuspele proksije treba zabeležiti i preskočiti, hvatajte očekivane mrežne greške oko pojedinačne provere. Pustite otkazivanje pokretanja da izađe do spoljnog rukovaoca. Za paralelne provere delite token pokretanja sa svakim radnikom i sačekajte njihovo završavanje pre omogućavanja novog pokretanja.

Povezani članci