Прокси тексерулері жүріп жатқанда 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 ішінде сақтаңыз; топтаманы күту шексіз желілік операцияны аяқтай алмайды.