Task.WaitAll v obravnavi klika WinForms blokira okno, tudi ko preverjanja sama uporabljajo asinhroni HTTP. Nit UI ne more obdelovati sporočil, zajeta nadaljevanja pa lahko potrebujejo isto blokirano nit.

Za .NET 6 ali novejši namesto tega počakajte omejen paket:

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

To spada v obstoječi obrazec z razpoložljivima System.Linq in System.Threading.Tasks. CheckProxyAsync izvaja omejen asinhroni vhod in izhod ter vrne en rezultat; ne upravlja kontrolnikov iz niti v ozadju. ShowResults in ShowCheckError sta metodi aplikacije.

Običajno nadaljevanje await se vrne v kontekst UI, kjer se je obravnava začela, zato lahko ShowResults posodobi kontrolnike. Koda, ki se izrecno izvaja v drugi niti, mora dostop do kontrolnikov posredovati prek podprtega mehanizma WinForms.

Seznam brezplačnih proxy lahko zagotovi vhodne naslove; posredujte samo protokole, ki jih izvaja CheckProxyAsync. Osem je primer proračuna. Naslednji paket čaka na najpočasnejše preverjanje v trenutnem paketu in zamenja nekaj prepustnosti za omejeno ustvarjanje opravil. Ohranite roke vsakega preverjanja in preklic v CheckProxyAsync; čakanje na paket ne more dokončati neomejene omrežne operacije.

Sorodni članki