Task.WaitAll í WinForms-klikkhandførara blokkerar vindeygað, sjálvt tá ið kanningarnar sjálvar brúka asynkront HTTP. UI-tráðurin kann ikki viðgerða boð, og fangaðar framhald kunnu tørva sama blokkerada tráðin.

Fyri .NET 6 ella nýggjari, bíðað eftir avmarkaðum skipsyrkingi:

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

Hetta hoyrir til í eini verandi form við System.Linq og System.Threading.Tasks tøkum. CheckProxyAsync ger avmarkað asynkront I/O og vendir aftur einum úrsliti; tað handterar ikki stýrieindir frá einum bakgrunnstráði. ShowResults og ShowCheckError eru applikatiónsmetodir.

Vanliga await-framhaldið vendir aftur til UI-samhengið har handførarin byrjaði, so ShowResults kann dagføra stýrieindir. Kotið sum beinleiðis gongur á øðrum tráði má flyta stýrieindatøkum gjøgnum tann stuðlaða WinForms-mekanismuna.

Ókeypis proxy-listin kann veita inntaksadressur; lat bert protokoll við sum CheckProxyAsync hevur gjørt. Átta er eitt dømisveiting. Næsta skipsyrking bíðar eftir seinasta kanningini í núverandi skipsyrking, og skiftir nakað av gjøgnumstreyminum fyri avmarkaða uppgávuskapan. Halt tíðarfrestrarnar fyri hvørja kanning og avtøkuna í CheckProxyAsync; at bíða eftir skipsyrking kann ikki fáa eina óavmarkaða netverkshandling at enda.

Skyldar greinar