Task.WaitAll en WinForms-klaka traktilo blokas la fenestron eĉ kiam la testoj mem uzas nesinkronan HTTP. La UI-fadeno ne povas prilabori mesaĝojn, kaj kaptitaj daŭrigoj eble bezonas tiun saman blokitan fadenon.

Por .NET 6 aŭ pli nova, anstataŭe atendu limigitan aron:

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

Ĉi tio apartenas al ekzistanta formo kun System.Linq kaj System.Threading.Tasks disponeblaj. CheckProxyAsync faras limigitan nesinkronan enigo/eligo kaj redonas unu rezulton; ĝi ne manipuladas kontrolojn el fona fadeno. ShowResults kaj ShowCheckError estas aplikaĵaj metodoj.

La normala daŭrigo de await revenas al la UI-kunteksto kie la traktilo komenciĝis, do ShowResults povas ĝisdatigi kontrolojn. Kodo eksplicite kuranta sur alia fadeno devas transigi kontrolan aliron per la subtenata WinForms-mekanismo.

La senpaga proksa listo povas provizi enigajn adresojn; transdonu nur protokolojn implementitajn de CheckProxyAsync. Ok estas ekzempla buĝeto. La sekva aro atendas la plej malrapidan teston en la nuna aro, interŝanĝante iom da trairo por limigita taskokreado. Konservu la templimojn de ĉiu testo kaj la nuligon en CheckProxyAsync; atendi aron ne povas igi senliman retoperacion finiĝi.

Rilataj artikoloj