Stopiwch rwystro WinForms tra bo gwiriadau procsï yn rhedeg
Disodlwch y Task.WaitAll cydamserol yn nolchwr digwyddiad y UI ag ysbeidiau cyfyngedig wedi'u haros, yna diweddarwch y rheolyddion yng nghyd-destun y UI a ailddechreuwyd.
Task.WaitAll mewn dolchwr clic WinForms yn rhwystro'r ffenestr hyd yn oed pan fo'r gwiriadau eu hunain yn defnyddio HTTP anghydamserol. Ni all edau'r UI brosesu negeseuon, ac efallai y bydd y parhâd a ddalwyd angen yr un edau rhwystredig.
Ar gyfer .NET 6 neu hwy, arhoswch am swp cyfyngedig yn lle hynny:
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;
}
}Mae hyn yn perthyn i ffurflen bresennol gyda System.Linq a System.Threading.Tasks ar gael. Mae CheckProxyAsync yn gwneud I/O anghydamserol cyfyngedig ac yn dychwelyd un canlyniad; nid yw'n trin rheolyddion o edau gefndir. Mae ShowResults a ShowCheckError yn ddulliau cymhwysiad.
Mae parhâd arferol await yn dychwelyd i gyd-destun yr UI lle dechreuodd y dolchwr, felly gall ShowResults ddiweddaru rheolyddion. Rhaid i god sy'n rhedeg yn benodol ar edau arall drosglwyddo mynediad i reolyddion trwy'r mecanwaith WinForms a gefnogir.
Gall y rhestr procsï rhad ddarparu cyfeiriadau mewnbwn; trosglwyddwch y protocolau a weithredir gan CheckProxyAsync yn unig. Wyth yw cyllideb enghreifftiol. Mae'r swp nesaf yn aros am y gwiriad arafaf yn y swp presennol, gan gyfnewid peth trwybwn am greu tasgau cyfyngedig. Cadwch ddyddiadau cau pob gwiriad a'r canslo yn CheckProxyAsync; ni all aros am swp wneud i weithrediad rhwydwaith heb gyfyngiad orffeni.