بىكار قىلىش كۇنۇپكىسى قېتىمنى توختىتىشى كېرەك. ئەگەر ھەر بىر پروكسى تەكشۈرۈش بىكار قىلىشنى تۇتۇپ نورمال قايتسا، تاشقى ھالقا كېيىنكى پروكسىغا ئۆتىدۇ. شۇ چاغدا ئېكران بىكار قىلىش ھېچنىمە قىلمىغاندەك كۆرۈنىدۇ.

زامانىۋى .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 مەۋجۇت تەكشۈرگۈچىگە تەۋە. بۇ ئاخىرقى نۇقتا ئۈچۈن مۇۋاپىق جاۋاب چوڭلۇقى چېكى ۋە ۋاقىت چېكىنى ساقلاڭ. ئىشلەپچىقىرىش تەكشۈرگۈچىسى خېرىدارلارنى يول بويىچە قايتا ئىشلىتەلەيدۇ؛ بۇ پارچە بىكار قىلىشنىڭ قەيەرگە ماڭىدىغانلىقىنى كۆرسىتىدۇ، ئۇلىنىش كۆلچىكى لايىھەسىنى ئەمەس.

ئەگەر مەغلۇپ بولغان پروكسىلارنى خاتىرىلەپ ئاتلاپ كېتىش كېرەك بولسا، يەككە تەكشۈرۈش ئەتراپىدىكى كۈتۈلگەن تور مەغلۇبىيەتلىرىنى تۇتۇڭ. قېتىم بىكار قىلىشىنى تاشقى بىر تەرەپ قىلغۇچىغا چىقىپ كېتىشكە يول قويۇڭ. پاراللېل تەكشۈرۈشلەر ئۈچۈن، قېتىم تىكنى ھەر بىر خىزمەتچى بىلەن ئورتاقلىشىڭ ۋە باشقا قېتىمنى قوزغىتىشتىن ئىلگىرى ئۇلارنىڭ تاماملىنىشىنى ساقلاڭ.

مۇناسىۋەتلىك ماقالىلەر