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 ത്രെഡിൽ നിന്ന് കൺട്രോളുകൾ കൈകാര്യം ചെയ്യുന്നില്ല. ShowResults, ShowCheckError എന്നിവ ആപ്ലിക്കേഷൻ മെത്തേഡുകളാണ്.

സാധാരണ await continuation, ഹാൻഡ്ലർ ആരംഭിച്ച UI context-ലേക്ക് തിരികെ വരുന്നു, അതിനാൽ ShowResults കൺട്രോളുകൾ അപ്ഡേറ്റ് ചെയ്യാൻ കഴിയും. മറ്റൊരു ത്രെഡിൽ വ്യക്തമായി പ്രവർത്തിക്കുന്ന കോഡ്, പിന്തുണയ്ക്കുന്ന WinForms സംവിധാനത്തിലൂടെ കൺട്രോൾ ആക്സസ് കൈമാറണം.

സൗജന്യ proxy ലിസ്റ്റ് ഇൻപുട്ട് വിലാസങ്ങൾ നൽകാം; CheckProxyAsync നടപ്പിലാക്കുന്ന പ്രോട്ടോക്കോളുകൾ മാത്രം നൽകുക. എട്ട് ഒരു ഉദാഹരണ ബജറ്റാണ്. അടുത്ത ബാച്ച് നിലവിലെ ബാച്ചിലെ ഏറ്റവും സാവധാനമായ പരിശോധനയ്ക്കായി കാത്തിരിക്കുന്നു, പരിമിതമായ ടാസ്ക് സൃഷ്ടിക്കായി കുറച്ച് throughput കൈമാറുന്നു. ഓരോ പരിശോധനയുടെയും സമയപരിധികളും cancellation-ഉം CheckProxyAsync-നുള്ളിൽ സൂക്ഷിക്കുക; ഒരു ബാച്ച് await ചെയ്യുന്നത് പരിമിതമല്ലാത്ത ഒരു നെറ്റ്വർക്ക് പ്രവർത്തനം പൂർത്തിയാക്കാൻ സഹായിക്കില്ല.

അനുബന്ധ ലേഖനങ്ങൾ