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.

Erthyglau cysylltiedig