Stop le WinForms a bhlocáil agus seiceálacha seachfhreastalaí ag rith
Cuir batseanna teoranta ar feitheamh in ionad an Task.WaitAll sioncrónach i láimhseálaí imeachta an UI, an ansin nuashonraigh na rialtáin sa chomhthéacs UI a atosaítear.
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.