Task.WaitAll u WinForms rukovaocu klika blokira prozor čak i kada same provjere koriste asinhroni HTTP. UI nit ne može obrađivati poruke, a snimljeni nastavci mogu trebati istu blokiranu nit.

Za .NET 6 ili noviji, umjesto toga čekajte ograničenu seriju:

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

Ovo pripada postojećoj formi s dostupnim System.Linq i System.Threading.Tasks. CheckProxyAsync obavlja ograničeni asinhroni I/O i vraća jedan rezultat; ne upravlja kontrolama iz pozadinske niti. ShowResults i ShowCheckError su metode aplikacije.

Uobičajeni nastavak await vraća se u UI kontekst u kojem je rukovalac počeo, pa ShowResults može ažurirati kontrole. Kod koji eksplicitno radi na drugoj niti mora proslijediti pristup kontrolama kroz podržani WinForms mehanizam.

Besplatna lista proxyja može dati ulazne adrese; prosljeđujte samo protokole koje implementira CheckProxyAsync. Osam je primjer budžeta. Sljedeća serija čeka najsporiju provjeru u trenutnoj seriji, razmjenjujući dio propusnosti za ograničeno stvaranje zadataka. Zadržite rokove svake provjere i otkazivanje u CheckProxyAsync; čekanje serije ne može dovršiti neograničenu mrežnu operaciju.

Povezani članci