Task.WaitAll WinForms klikšķa apstrādē bloķē logu pat tad, ja pašas pārbaudes izmanto asinhrono HTTP. UI pavediens nevar apstrādāt ziņojumus, un saglabātajiem turpinājumiem var būt nepieciešams tas pats bloķētais pavediens.

Ja izmantojat .NET 6 vai jaunāku versiju, tā vietā gaidiet ierobežotu partiju:

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

Tas pieder esošai formai, kurā ir pieejami System.Linq un System.Threading.Tasks. CheckProxyAsync veic ierobežotu asinhrono ievadi un izvadi un atgriež vienu rezultātu; tā neapstrādā vadīklas no fona pavediena. ShowResults un ShowCheckError ir lietojumprogrammas metodes.

Parastais await turpinājums atgriežas UI kontekstā, kurā sākās apstrādātājs, tāpēc ShowResults var atjaunināt vadīklas. Kodam, kas skaidri darbojas citā pavedienā, vadīklu piekļuve jāpārsūta ar atbalstīto WinForms mehānismu.

Bezmaksas proxy saraksts var nodrošināt ievades adreses; nododiet tikai protokolus, ko īsteno CheckProxyAsync. Astoņi ir piemēra budžets. Nākamā partija gaida lēnāko pārbaudi pašreizējā partijā, apmainot daļu caurlaidspējas pret ierobežotu uzdevumu izveidi. Saglabājiet katras pārbaudes termiņus un atcelšanu CheckProxyAsync iekšienē; partijas gaidīšana nevar likt neierobežotai tīkla darbībai beigties.

Saistītie raksti