Task.WaitAll yn in WinForms-klikôffelder blokkearret it finster sels as de kontrôles sels asynkrone HTTP brûke. De UI-tried kin gjin berjochten ferwurkje, en fêstleine ferfolgen hawwe miskien deselde blokkearre tried nedich.

Foar .NET 6 of letter, wachtsje ynstee op in beheinde batch:

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

Dit heart yn in besteand formulier mei System.Linq en System.Threading.Tasks beskikber. CheckProxyAsync docht beheinde asynkrone I/O en jout ien resultaat werom; it manipulearret gjin kontrôles fan in eftergrûntried ôf. ShowResults en ShowCheckError binne applikaasjemetoaden.

De normale await-ferfolch komt werom yn 'e UI-kontekst dêr't de ôffelder begûn, sadat ShowResults kontrôles bywurkje kin. Koade dy't eksplisyt op in oare tried rint, moat kontrôle-tagong trochjaan fia it stipe WinForms-meganisme.

De fergees proxy-list kin ynfieradressen leverje; jou allinnich protokollen troch dy't CheckProxyAsync ymplementearret. Acht is in foarbyldbudzjet. De folgjende batch wachtet op 'e stadichste kontrôle yn 'e hjoeddeiske batch, en ruilet wat trochset foar beheinde taakopbou. Hâld de deadlines fan elke kontrôle en de annulering yn CheckProxyAsync; wachtsje op in batch kin in ûnbeheinde netwurkoperaasje net ôfmeitsje.

Relatearre artikelen