Бутонът за отказ трябва да спре изпълнението. Ако всяка проверка на прокси хване отказа и се върне нормално, външният цикъл просто преминава към следващото прокси. Тогава екранът изглежда все едно отказът не е направил нищо.

В съвременния .NET WinForms дръжте един източник като поле на формата и оставете отказа да стигне до обработчика на събитието:

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 е вече анализираният списък с URI на прокси в приложението. Редове от списъка с безплатни проксита могат да захранват разрешена проверка на публична цел; запазете протокола и използвайте само типове, които този обработчик поддържа. UI изчаква всяка операция, така че цикълът на съобщенията остава свободен да приеме клика за отказ.

Предайте токена към мрежата

Отделната проверка трябва да приеме този токен. Съкратена HTTP проверка може да изглежда така:

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 и RecordResult принадлежат на съществуващия проверяващ. Дръжте подходящо ограничение за размера на отговора и време за изчакване за тази крайна точка. Производственият проверяващ може да преизползва клиенти по маршрут; фрагментът показва къде пътува отказът, а не дизайн на пул от връзки.

Ако неуспешните проксита трябва да се записват и пропускат, хващайте очакваните мрежови грешки около отделната проверка. Оставете отказа на изпълнението да излезе към външния обработчик. За паралелни проверки споделяйте токена на изпълнението с всеки работник и изчакайте завършването им, преди да разрешите ново изпълнение.

Подобни статии