proxy जाँचहरू चलिरहेको बेला WinForms अवरोध गर्न रोक्नुहोस्
UI इभेन्ट ह्यान्डलरमा रहेको synchronous Task.WaitAll लाई awaited, सीमित ब्याचहरूले प्रतिस्थापन गर्नुहोस्, त्यसपछि पुनः सुरु भएको UI context मा controls अद्यावधिक गर्नुहोस्।
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 ले लागू गर्ने प्रोटोकलहरू मात्र पठाउनुहोस्। आठ एउटा उदाहरण बजेट हो। अर्को ब्याच हालको ब्याचको सबैभन्दा ढिलो जाँचको प्रतीक्षा गर्छ, सीमित task सिर्जनाको लागि केही throughput साट्दै। प्रत्येक जाँचको समयसीमा र cancellation CheckProxyAsync भित्र राख्नुहोस्; ब्याच await गर्दा असीमित नेटवर्क अपरेसन सकिँदैन।