Спыніце блакаванне WinForms падчас праверкі проксі
Замяніце сінхронны Task.WaitAll у апрацоўшчыку падзей UI на чаканыя абмежаваныя пачкі, затым абнавіце элементы кіравання ў адноўленым кантэксце UI.
Task.WaitAll у апрацоўшчыку клікаў WinForms блакуе акно, нават калі самі праверкі выкарыстоўваюць асінхронны HTTP. Паток UI не можа апрацоўваць паведамленні, і захопленыя працягі могуць патрабаваць таго ж заблакаванага патоку.
Для .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 выконвае абмежаваны асінхронны ўвод/вывад і вяртае адзін вынік; ён не кіруе элементамі кіравання з фонавага патоку. ShowResults і ShowCheckError — метады праграмы.
Звычайнае працягванне await вяртаецца ў кантэкст UI, дзе пачаўся апрацоўшчык, таму ShowResults можа абнаўляць элементы кіравання. Код, які відавочна выконваецца ў іншым патоку, павінен перадаваць доступ да элементаў кіравання праз падтрымоўваны механізм WinForms.
Спіс бясплатных проксі можа даць адрасы для ўводу; перадавайце толькі пратаколы, рэалізаваныя CheckProxyAsync. Восем — гэта прыклад бюджэту. Наступная пачка чакае найпавольнейшую праверку ў бягучай пачцы, абменьваючы частку прапускной здольнасці на абмежаванае стварэнне задач. Захоўвайце тэрміны кожнай праверкі і адмену ў CheckProxyAsync; чаканне пачкі не можа прымусіць неабмежаваную сеткавую аперацыю завяршыцца.