Slutt å blokkere WinForms medan proxykontrollar køyrer
Byt ut ein synkron Task.WaitAll i UI-hendingshandsamaren med avventa, avgrensa batcar, og oppdater deretter kontrollane i den gjenopptekne UI-konteksten.
Task.WaitAll i ein WinForms-klikkhandsamar blokkerer vindauget sjølv når kontrollane sjølve brukar asynkron HTTP. UI-tråden kan ikkje handsame meldingar, og fanga fortsetjingar kan trengje den same blokkerte tråden.
For .NET 6 eller nyare, vent på ein avgrensa batch i staden:
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;
}
}Dette høyrer heime i eit eksisterande skjema med System.Linq og System.Threading.Tasks tilgjengelege. CheckProxyAsync gjer avgrensa asynkron inn- og utdata og returnerer eitt resultat; ho manipulerer ikkje kontrollar frå ein bakgrunnstråd. ShowResults og ShowCheckError er applikasjonsmetodar.
Den vanlege await-fortsetjinga går tilbake til UI-konteksten der handsamaren starta, slik at ShowResults kan oppdatere kontrollar. Kode som eksplisitt køyrer på ein annan tråd, må senda kontrolltilgang gjennom den støtta WinForms-mekanismen.
Gratis proxy-liste kan levera inndataadresser; send berre protokollar som CheckProxyAsync implementerer. Åtte er eit døme på budsjett. Neste batch ventar på den tregaste kontrollen i gjeldande batch, og byter noko gjennomstraum mot avgrensa oppgåveoppretting. Hald kvar kontroll sine tidsfristar og kansellering i CheckProxyAsync; å venta på ein batch kan ikkje få ein ubegrensa nettverksoperasjon til å fullførast.