Bekor qilish tugmasi ishga tushishni to'xtatishi kerak. Agar har bir proksi tekshiruvi bekor qilishni ushlab, odatdagidek qaytsa, tashqi sikl shunchaki keyingi proksiga o'tadi. Shunda ekran Bekor qilish hech narsa qilmagandek ko'rinadi.

Zamonaviy .NET WinForms da bitta manbani forma maydoni sifatida saqlang va bekor qilish hodisa ishlovchisiga yetib borishiga ruxsat bering:

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 ilova allaqachon tahlil qilgan proksi URI ro'yxatidir. Bepul proksi ro'yxatidagi satrlar ruxsat etilgan ommaviy maqsad tekshiruvini oziqlantirishi mumkin; protokolni saqlang va faqat shu ishlovchi qo'llab-quvvatlaydigan turlardan foydalaning. UI har bir amalni kutadi, shuning uchun xabar sikli bekor qilish bosilishini qabul qilish uchun bo'sh qoladi.

Tokenni tarmoqqa olib boring

Alohida tekshiruv shu tokenni qabul qilishi kerak. Qisqartirilgan HTTP tekshiruvi shunday ko'rinishi mumkin:

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 va RecordResult mavjud tekshiruvchiga tegishli. Bu so'nggi nuqta uchun mos javob hajmi chegarasi va vaqt chegarasini saqlang. Ishlab chiqarish tekshiruvchisi mijozlarni marshrut bo'yicha qayta ishlatishi mumkin; parcha bekor qilish qayerga o'tishini ko'rsatadi, ulanishlar hovuzi dizaynini emas.

Agar muvaffaqiyatsiz proksilar qayd etilib, o'tkazib yuborilishi kerak bo'lsa, alohida tekshiruv atrofida kutilgan tarmoq xatolarini ushlang. Ishga tushish bekor qilishining tashqi ishlovchiga chiqishiga ruxsat bering. Parallel tekshiruvlar uchun ishga tushish tokenini har bir ishchiga ulashing va boshqa ishga tushishni yoqishdan oldin ularning tugashini kuting.

O'xshash maqolalar