Task.WaitAll во обработувач на клик во WinForms го блокира прозорецот дури и кога самите проверки користат асинхрони HTTP. Нишката на UI не може да обработува пораки, а зачуваните продолженија може да ја бараат истата блокирана нишка.

За .NET 6 или поново, наместо тоа чекајте ограничена серија:

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

Ова припаѓа на постоечка форма со достапни System.Linq и System.Threading.Tasks. CheckProxyAsync извршува ограничен асинхрон влез и излез и враќа еден резултат; таа не управува со контроли од позадинска нишка. ShowResults и ShowCheckError се методи на апликацијата.

Нормалното продолжение на await се враќа во UI контекстот каде што започна обработувачот, па ShowResults може да ги ажурира контролите. Кодот што експлицитно работи на друга нишка мора да го пренесе пристапот до контролите преку поддржаниот механизам на WinForms.

Списокот на бесплатни proxy може да обезбеди влезни адреси; пренесувајте само протоколи што ги имплементира CheckProxyAsync. Осум е примерен буџет. Следната серија го чека најбавното проверување во тековната серија, разменувајќи дел од пропусната моќ за ограничено создавање задачи. Чувајте ги роковите на секоја проверка и откажувањето во CheckProxyAsync; чекањето серија не може да направи неограничена мрежна операција да заврши.

Поврзани статии