Task.WaitAll WinFormsi klõpsu töötlejas blokeerib akna isegi siis, kui kontrollid ise kasutavad asünkroonset HTTP-d. UI lõim ei saa sõnumeid töödelda ja jäädvustatud jätkud võivad vajada sama blokeeritud lõime.

.NET 6 või uuema puhul oodake selle asemel piiratud partiid:

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

See kuulub olemasolevasse vormi, kus on saadaval System.Linq ja System.Threading.Tasks. CheckProxyAsync teeb piiratud asünkroonset I/O-d ja tagastab ühe tulemuse; see ei halda juhtelemente taustalõimest. ShowResults ja ShowCheckError on rakenduse meetodid.

Tavaline await jätk naaseb UI konteksti, kus töötleja algas, nii et ShowResults saab juhtelemente värskendada. Kood, mis töötab selgelt teises lõimes, peab juhtelemendile juurdepääsu edastama toetatud WinFormsi mehhanismi kaudu.

Tasuta puhverserverite loend võib anda sisendaadresse; edastage ainult protokolle, mida CheckProxyAsync rakendab. Kaheksa on näidiseelarve. Järgmine partii ootab praeguse partii kõige aeglasemat kontrolli, vahetades osa läbilaskevõimest piiratud ülesannete loomise vastu. Hoidke iga kontrolli tähtajad ja tühistamine asukohas CheckProxyAsync; partii ootamine ei saa lõpetada piiramatut võrgutoimingut.

Seotud artiklid