Цуцлах товч гүйлтийг зогсоох ёстой. Хэрэв прокси шалгалт бүр цуцлалтыг барьж, хэвийн буцаж ирвэл гадаад давталт дараагийн прокси руу шилждэг. Тэгвэл дэлгэц Цуцлах юу ч хийгээгүй мэт харагдана.

Орчин үеийн .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 нь одоо байгаа шалгагчид хамаарна. Энэ төгсгөлийн цэгт тохирох хариултын хэмжээний хязгаар, хугацааны хязгаар хадгална. Үйлдвэрлэлийн шалгагч маршрутаар клиентүүдийг дахин ашиглаж болно; энэ хэсэг нь цуцлалт хаашаа явдгийг харуулж байна, холболтын пулын загвар биш.

Хэрэв бүтэлгүй проксинуудыг бүртгэж, алгасах бол бие даасан шалгалтын эргэн тойронд хүлээгдэж буй сүлжээний алдааг барь. Гүйлтийн цуцлалт гадаад зохицуулагч руу гарч болно. Зэрэгцээ шалгалтын хувьд гүйлтийн токеныг ажилтан бүртэй хуваалцаж, өөр гүйлт идэвхжүүлэхийн өмнө тэдний дуусахыг хүлээ.

Холбоотой нийтлэлүүд