Копчето Откажи треба да го запре извршувањето. Ако секоја проверка на прокси го фати откажувањето и се врати нормално, надворешната јамка едноставно преминува на следното прокси. Тогаш екранот изгледа како Откажи да не направил ништо.

Во современиот .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 припаѓаат на постоечкиот проверувач. Одржувајте соодветно ограничување на големината на одговорот и временско ограничување за оваа крајна точка. Производниот проверувач може повторно да ги користи клиентите по маршрута; исечокот покажува каде патува откажувањето, а не дизајн на базен за врски.

Ако неуспешните проксија треба да се запишуваат и прескокнуваат, фатете ги очекуваните мрежни грешки околу поединечната проверка. Дозволете откажувањето на извршувањето да избега до надворешниот ракувач. За паралелни проверки, споделете го токенот на извршувањето со секој работник и почекајте да завршат пред да дозволите друго извршување.

Поврзани статии