Prestanite blokirati WinForms dok provjere proxyja rade
Zamijenite sinhroni Task.WaitAll u rukovatelju UI događaja očekivanim, ograničenim serijama, a zatim ažurirajte kontrole u obnovljenom UI kontekstu.
Task.WaitAll u WinForms rukovatelju klika blokira prozor čak i kada same provjere koriste asinhroni HTTP. UI nit ne može obrađivati poruke, a snimljeni nastavci mogu trebati istu blokiranu nit.
Za .NET 6 ili noviji, umjesto toga čekajte ograničenu seriju:
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;
}
}Ovo pripada postojećoj formi s dostupnim System.Linq i System.Threading.Tasks. CheckProxyAsync obavlja ograničeni asinhroni I/O i vraća jedan rezultat; ne upravlja kontrolama iz pozadinske niti. ShowResults i ShowCheckError su metode aplikacije.
Uobičajeni nastavak await vraća se u UI kontekst u kojem je rukovatelj počeo, pa ShowResults može ažurirati kontrole. Kod koji izričito radi na drugoj niti mora proslijediti pristup kontrolama kroz podržani WinForms mehanizam.
Besplatan popis proxyja može dati ulazne adrese; prosljeđujte samo protokole koje implementira CheckProxyAsync. Osam je primjer proračuna. Sljedeća serija čeka najsporiju provjeru u trenutnoj seriji, razmjenjujući dio propusnosti za ograničeno stvaranje zadataka. Zadržite rokove svake provjere i otkazivanje u CheckProxyAsync; čekanje serije ne može dovršiti neograničenu mrežnu operaciju.