Task.WaitAll in 'n WinForms-klikhanteerder blokkeer die venster selfs wanneer die kontroles self asinchrone HTTP gebruik. Die UI-draad kan nie boodskappe verwerk nie, en vasgevangde voortsettings het moontlik daardie selfde geblokkeerde draad nodig.

Vir .NET 6 of later, wag eerder op 'n begrensde bondel:

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;
    }
}

Dit hoort in 'n bestaande vorm met System.Linq en System.Threading.Tasks beskikbaar. CheckProxyAsync doen begrensde asinchrone I/O en gee een resultaat terug; dit manipuleer nie kontroles vanuit 'n agtergronddraad nie. ShowResults en ShowCheckError is toepassingsmetodes.

Die normale await-voortsetting keer terug na die UI-konteks waar die hanteerder begin het, so ShowResults kan kontroles bywerk. Kode wat duidelik op 'n ander draad loop, moet kontroletoegang deur die ondersteunde WinForms-meganisme marsjeer.

Die gratis proxylys kan insetadresse verskaf; gee slegs protokolle deur wat CheckProxyAsync implementeer. Agt is 'n voorbeeldbegroting. Die volgende bondel wag vir die stadigste kontrole in die huidige bondel, wat 'n mate van deurset inruil vir begrensde taakskeping. Hou elke kontrole se sperdatums en kansellasie in CheckProxyAsync; om op 'n bondel te wag kan nie 'n onbegrensde netwerkbewerking laat klaarkry nie.

Verwante artikels