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 tu istu blokiranu nit.

Za .NET 6 ili noviji, umjesto toga sač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 sa dostupnim System.Linq i System.Threading.Tasks. CheckProxyAsync obavlja ograničeni asinhroni ulaz i izlaz 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.

Lista besplatnih proxy može dati ulazne adrese; proslijedite 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