Прокси текшерүүлөрү жүрүп жатканда WinForms бөгөттөөнү токтотуңуз
UI окуя иштетүүчүсүндөгү синхрондук Task.WaitAll-ды күтүлгөн, чектелген топтомдор менен алмаштырыңыз, андан кийин уланган 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 чектелген асинхрондук I/O аткарып, бир натыйжа кайтарат; ал фондук агымдан башкаруу элементтерин башкарбайт. ShowResults жана ShowCheckError колдонмо ыкмалары.
await кадимки уландысы иштетүүчү башталган UI контекстине кайтат, ошондуктан ShowResults башкаруу элементтерин жаңырта алат. Башка агымда ачык иштеген код башкаруу элементтерине жетүүнү колдоого алынган WinForms механизми аркылуу өткөрүшү керек.
Акысыз прокси тизмеси кирүү дарегин бере алат; CheckProxyAsync ишке ашырган протоколдорду гана өткөрүңүз. Сегиз — бул мисал бюджети. Кийинки топтом учурдагы топтомдогу эң жай текшерүүнү күтөт, ошону менен өткөрүү жөндөмдүүлүгүнүн бир бөлүгүн чектелген тапшырма түзүүгө алмаштырат. Ар бир текшерүүнүн мөөнөттөрүн жана жокко чыгарууну CheckProxyAsync ичинде сактаңыз; топтомду күтүү чексиз тармактык операцияны бүтүрө албайт.