रद्द करें बटन को रन रोकना चाहिए। अगर हर प्रॉक्सी जाँच रद्दीकरण पकड़कर सामान्य रूप से लौटती है, तो बाहरी लूप बस अगले प्रॉक्सी पर चला जाता है। तब स्क्रीन ऐसी दिखती है जैसे रद्द करें ने कुछ नहीं किया।

आधुनिक .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 मौजूदा जाँचकर्ता के हैं। इस एंडपॉइंट के लिए उपयुक्त प्रतिक्रिया-आकार सीमा और टाइमआउट रखें। उत्पादन जाँचकर्ता मार्ग के अनुसार क्लाइंट फिर से इस्तेमाल कर सकता है; अंश दिखाता है कि रद्दीकरण कहाँ जाता है, कनेक्शन-पूल डिज़ाइन नहीं।

अगर विफल प्रॉक्सी दर्ज करके छोड़ने हैं, तो व्यक्तिगत जाँच के आसपास अपेक्षित नेटवर्क विफलताएँ पकड़ें। रन रद्दीकरण को बाहरी हैंडलर तक निकलने दें। समानांतर जाँचों के लिए, रन टोकन हर वर्कर के साथ साझा करें और दूसरा रन सक्षम करने से पहले उनके पूरा होने की प्रतीक्षा करें।

संबंधित लेख