Dapat ihinto ng pindutang Kanselahin ang pagtakbo. Kung nahuhuli ng bawat pagsusuri ng proxy ang pagkansela at normal na bumabalik, lalipat lang ang panlabas na loop sa susunod na proxy. Mukhang walang ginawa ang Kanselahin sa screen.

Sa modernong .NET WinForms, panatilihin ang isang pinagmumulan bilang field ng form at hayaang maabot ng pagkansela ang tagahawak ng kaganapan:

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 ang listahan ng URI ng proxy na na-parse na ng app. Ang mga hilera mula sa listahan ng libreng proxy ay maaaring magpakain ng pinapayagang pagsusuri ng pampublikong target; panatilihin ang protocol at gumamit lamang ng mga uri na sinusuportahan ng tagahawak na ito. Naghihintay ang UI sa bawat operasyon, kaya nananatiling libre ang loop ng mensahe upang tanggapin ang pag-click ng pagkansela.

Dalhin ang token sa network

Dapat tanggapin ng indibidwal na pagsusuri ang token na iyon. Ang pinaikling pagsusuri ng HTTP ay maaaring ganito:

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);
}

Ang probeUri at RecordResult ay pag-aari ng umiiral na tagasuri. Panatilihin ang angkop na limitasyon sa laki ng tugon at timeout para sa endpoint na ito. Ang tagasuri sa produksiyon ay maaaring muling gumamit ng mga kliyente ayon sa ruta; ipinapakita ng fragment kung saan naglalakbay ang pagkansela, hindi disenyo ng pool ng koneksyon.

Kung dapat itala at laktawan ang mga nabigong proxy, hulihin ang inaasahang pagkabigo ng network sa paligid ng indibidwal na pagsusuri. Hayaang makatakas ang pagkansela ng pagtakbo sa panlabas na tagahawak. Para sa magkakatulad na pagsusuri, ibahagi ang token ng pagtakbo sa bawat manggagawa at hintayin ang kanilang pagtatapos bago paganahin ang isa pang pagtakbo.

Kaugnay na mga artikulo