Task.WaitAll i láimhseálaí cliceála WinForms blocálann an fhuinneog fiú nuair a úsáideann na seiceálacha féin HTTP asincrónach. Ní féidir le snáithe an UI teachtaireachtaí a phróiseáil, agus b'fhéidir go mbeadh na leanúintí gabhála ag teastáil ón snáithe blocáilte céanna.

I .NET 6 nó níos déanaí, fan le batse teoranta ina ionad:

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

Baineann sé seo le foirm atá ann cheana le System.Linq agus System.Threading.Tasks ar fáil. Déanann CheckProxyAsync I/O asincrónach teoranta agus filleann sé toradh amháin; ní ionramhálann sé rialtáin ó snáithe chúlra. Is modhanna feidhmchláir iad ShowResults agus ShowCheckError.

Filleann leanúint normalach await ar an gcomhthéacs UI inar thosaigh an láimhseálaí, mar sin is féidir le ShowResults rialtáin a nuashonrú. Caithfidh cód a ritheann go sainráite ar shnáithe eile rochtain ar rialtáin a mharshalú tríd an meicníocht WinForms a thacaítear léi.

Is féidir leis an liosta seachfhreastalaithe saor in aisce seoltaí ionchuir a sholáthar; ná cuir ach prótacail a chuireann CheckProxyAsync i bhfeidhm. Is buiséad samplach é a hocht. Fanann an chéad bhatse eile leis an seiceáil is moille sa bhatse reatha, ag malartú roinnt tréchurtha ar chruthú tascanna teoranta. Coinnigh spriocdhátaí gach seiceála agus an chealú i CheckProxyAsync; ní féidir le fanacht le batse a dhéanamh go gcríochnóidh oibríocht líonra neamhtheoranta.

Ailt ghaolmhara