Nupp Tühista peaks käigu peatama. Kui iga puhverserveri kontroll püüab tühistamise ja naaseb tavaliselt, liigub välimine tsükkel lihtsalt järgmise puhverserveri juurde. Siis näeb ekraan välja, nagu Tühista ei teeks midagi.

Kaasaegses .NET WinForms hoidke üht allikat vormiväljana ja laske tühistamisel jõuda sündmuse käsitlejani:

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 on rakenduse juba parsitud puhverserveri URI-de loend. Read tasuta puhverserverite loendist võivad toita lubatud avaliku sihtmärgi kontrolli; säilitage protokoll ja kasutage ainult tüüpe, mida see käsitleja toetab. UI ootab iga toimingut, nii et sõnumitsükkel jääb tühistamise klõpsu vastuvõtmiseks vabaks.

Viige token võrku

Üksikkontroll peab selle tokeni vastu võtma. Lühendatud HTTP-kontroll võib välja näha nii:

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 ja RecordResult kuuluvad olemasolevale kontrollijale. Hoidke selle lõpp-punkti jaoks sobivat vastuse suuruse piiri ja ajalõpu. Tootmiskontrollija saab kliente marsruudi kaupa uuesti kasutada; katkend näitab, kuhu tühistamine liigub, mitte ühenduste basseini kujundust.

Kui ebaõnnestunud puhverserverid tuleb kirja panna ja vahele jätta, püüdke üksikkontrolli ümber oodatavaid võrguvigu. Laske käigu tühistamisel väljuda välimisse käsitlejasse. Paralleelsete kontrollide puhul jagage käigu tokenit iga töötajaga ja oodake nende lõpetamist enne uue käigu lubamist.

Seotud artiklid