Task.WaitAll i en WinForms-klikkbehandler blokkerer vinduet selv når kontrollene selv bruker asynkron HTTP. UI-tråden kan ikke behandle meldinger, og fangede fortsettelser kan trenge den samme blokkerte tråden.

For .NET 6 eller nyere, vent på en avgrenset batch i stedet:

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ører hjemme i et eksisterende skjema med System.Linq og System.Threading.Tasks tilgjengelig. CheckProxyAsync utfører avgrenset asynkron inn- og utdata og returnerer ett resultat; den manipulerer ikke kontroller fra en bakgrunnstråd. ShowResults og ShowCheckError er applikasjonsmetoder.

Den vanlige await-fortsettelsen går tilbake til UI-konteksten der behandleren startet, slik at ShowResults kan oppdatere kontroller. Kode som eksplisitt kjører på en annen tråd, må sende kontrolltilgang gjennom den støttede WinForms-mekanismen.

Gratis proxy-liste kan levere inndataadresser; send bare protokoller som CheckProxyAsync implementerer. Åtte er et eksempelbudsjett. Neste batch venter på den tregeste kontrollen i gjeldende batch, og bytter noe gjennomstrømning mot avgrenset oppgaveoppretting. Behold hver kontrolls tidsfrister og kansellering i CheckProxyAsync; å vente på en batch kan ikke få en ubegrenset nettverksoperasjon til å fullføres.

Relaterte artikler