Task.WaitAll í WinForms-smellhandfara lokar glugganum jafnvel þótt prófanirnar sjálfar noti ósamhliða HTTP. UI-þráðurinn getur ekki unnið úr skilaboðum og handteknar framhaldir gætu þurft sama lokaða þráðinn.

Fyrir .NET 6 eða nýrri, bíðið í staðinn eftir takmarkaðri lotu:

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

Þetta á heima í fyrirliggjandi formi þar sem System.Linq og System.Threading.Tasks eru tiltæk. CheckProxyAsync framkvæmir takmarkaða ósamhliða I/O og skilar einni niðurstöðu; hún stýrir ekki stýringum frá bakgrunnsþræði. ShowResults og ShowCheckError eru aðferðir forritsins.

Venjulegt await-framhald fer aftur í UI-samhengið þar sem handfarinn byrjaði, svo ShowResults getur uppfært stýringar. Kóði sem keyrir skýrt á öðrum þræði verður að flytja aðgang að stýringum í gegnum studda WinForms-aðferðina.

Listi yfir ókeypis proxy getur veitt innsláttarvistföng; sendið aðeins samskiptareglur sem CheckProxyAsync útfærir. Átta er dæmi um fjárhagsáætlun. Næsta lota bíður eftir hægasta prófuninni í núverandi lotu og skiptir hluta af afköstum fyrir takmarkaða stofnun verkefna. Haldið tímafrestum hverrar prófunar og afbókun inni í CheckProxyAsync; að bíða eftir lotu getur ekki látið ótakmarkaða netaðgerð ljúka.

Tengdir greinar