proxy പരിശോധനകൾ നടക്കുമ്പോൾ WinForms തടയുന്നത് നിർത്തുക
UI ഇവന്റ് ഹാൻഡ്ലറിലെ synchronous Task.WaitAll മാറ്റി awaited, പരിമിതമായ ബാച്ചുകൾ ഉപയോഗിക്കുക, തുടർന്ന് പുനരാരംഭിച്ച UI context-ൽ കൺട്രോളുകൾ അപ്ഡേറ്റ് ചെയ്യുക.
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 ചെയ്യുന്നത് പരിമിതമല്ലാത്ത ഒരു നെറ്റ്വർക്ക് പ്രവർത്തനം പൂർത്തിയാക്കാൻ സഹായിക്കില്ല.