WinForms क्लिक हँडलरमधील Task.WaitAll, तपासण्या स्वतः asynchronous HTTP वापरत असल्या तरीही विंडो अडवते. UI थ्रेड संदेशांवर प्रक्रिया करू शकत नाही, आणि कैद केलेल्या continuation ला तोच अडवलेला थ्रेड लागू शकतो.

.NET 6 किंवा नंतरच्या आवृत्तीसाठी, त्याऐवजी मर्यादित बॅच await करा:

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 इनपुट आणि आउटपुट करते आणि एक निकाल परत करते; ती background थ्रेडवरून controls हाताळत नाही. ShowResults आणि ShowCheckError ॲप्लिकेशन पद्धती आहेत.

await चा नेहमीचा continuation हँडलर जिथे सुरू झाला त्या UI context मध्ये परत येतो, त्यामुळे ShowResults controls अद्ययावत करू शकते. दुसऱ्या थ्रेडवर स्पष्टपणे चालणाऱ्या कोडला control प्रवेश समर्थित WinForms यंत्रणेद्वारे पाठवावा लागतो.

विनामूल्य proxy यादी इनपुट पत्ते देऊ शकते; फक्त CheckProxyAsync लागू करते ते प्रोटोकॉल पाठवा. आठ हे उदाहरण बजेट आहे. पुढील बॅच सध्याच्या बॅचमधील सर्वात संथ तपासणीसाठी थांबते, काही throughput च्या बदल्यात मर्यादित task निर्मिती. प्रत्येक तपासणीच्या मुदती आणि cancellation CheckProxyAsync मध्ये ठेवा; बॅच await केल्याने अमर्यादित नेटवर्क ऑपरेशन पूर्ण होऊ शकत नाही.

संबंधित लेख