Lopeta WinFormsin jäädyttäminen proxytarkistusten aikana
Korvaa UI-tapahtumakäsittelijän synkroninen Task.WaitAll odotetuilla, rajoitetuilla erillä ja päivitä sitten komponentit jatketussa UI-kontekstissa.
Task.WaitAll WinFormsin napsautuskäsittelijässä jäädyttää ikkunan, vaikka tarkistukset itse käyttävät asynkronista HTTP:tä. UI-säie ei voi käsitellä viestejä, ja kaapatut jatkot saattavat tarvita saman estetyn säikeen.
.NET 6:ssa tai uudemmassa odota sen sijaan rajoitettua erää:
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;
}
}Tämä kuuluu olemassa olevaan lomakkeeseen, jossa System.Linq ja System.Threading.Tasks ovat käytettävissä. CheckProxyAsync tekee rajoitettua asynkronista I/O:ta ja palauttaa yhden tuloksen; se ei käsittele komponentteja taustasäikeestä. ShowResults ja ShowCheckError ovat sovelluksen metodeja.
await:n normaali jatko palaa siihen UI-kontekstiin, jossa käsittelijä alkoi, joten ShowResults voi päivittää komponentteja. Toisessa säikeessä eksplisiittisesti ajautuva koodi on välitettävä komponenttien käyttö tuetun WinForms-mekanismin kautta.
Ilmainen proxyluettelo voi tarjota syöteosoitteita; välitä vain protokollat, jotka CheckProxyAsync toteuttaa. Kahdeksan on esimerkkibudjetti. Seuraava erä odottaa nykyisen erän hitainta tarkistusta vaihtaen osan läpimenosta rajoitettuun tehtävien luontiin. Pidä kunkin tarkistuksen määräajat ja peruutus CheckProxyAsync:ssä; erän odottaminen ei voi saada rajatonta verkkotoimea valmiiksi.