Task.WaitAll WinForms क्लिक हैंडलर में विंडो को ब्लॉक कर देता है, तब भी जब जाँचें स्वयं asynchronous HTTP का उपयोग करती हों। UI थ्रेड संदेशों को संसाधित नहीं कर सकता, और कैप्चर किए गए continuation को वही ब्लॉक किया गया थ्रेड चाहिए हो सकता है।

.NET 6 या बाद के संस्करण में, इसके बजाय सीमित बैच की प्रतीक्षा करें:

private async void checkButton_Click(object sender, EventArgs e)
{
    checkButton.Enabled = false;
    try
    {
        var entries = proxyList.Lines
            .Where(line => !string.IsNullOrWhiteSpace(line));
        foreach (var batch in entries.Chunk(8))
        {
            var results = await Task.WhenAll(batch.Select(CheckProxyAsync));
            ShowResults(results);
        }
    }
    catch (Exception error)
    {
        ShowCheckError(error);
    }
    finally
    {
        checkButton.Enabled = true;
    }
}

यह System.Linq और System.Threading.Tasks उपलब्ध होने पर किसी मौजूदा फ़ॉर्म में जाता है। CheckProxyAsync सीमित asynchronous I/O करता है और एक परिणाम लौटाता है; यह बैकग्राउंड थ्रेड से नियंत्रण नहीं संभालता। ShowResults और ShowCheckError एप्लिकेशन मेथड हैं।

सामान्य await continuation उसी UI संदर्भ में लौटता है जहाँ हैंडलर शुरू हुआ था, इसलिए ShowResults नियंत्रण अपडेट कर सकता है। जो कोड स्पष्ट रूप से किसी अन्य थ्रेड पर चलता है, उसे समर्थित WinForms तंत्र के माध्यम से नियंत्रण-पहुँच भेजनी होगी।

निःशुल्क प्रॉक्सी सूची इनपुट पते दे सकती है; केवल वे प्रोटोकॉल भेजें जिन्हें CheckProxyAsync लागू करता है। आठ एक उदाहरण बजट है। अगला बैच वर्तमान बैच की सबसे धीमी जाँच की प्रतीक्षा करता है, जिससे कुछ थ्रूपुट सीमित कार्य निर्माण के बदले चला जाता है। प्रत्येक जाँच की समय-सीमा और रद्दीकरण को CheckProxyAsync में रखें; बैच की प्रतीक्षा करने से असीमित नेटवर्क ऑपरेशन पूरा नहीं हो सकता।

संबंधित लेख