Task.WaitAll em um manipulador de clique do WinForms bloqueia a janela mesmo quando as próprias verificações usam HTTP assíncrono. A thread de UI não consegue processar mensagens, e continuações capturadas podem precisar dessa mesma thread bloqueada.

No .NET 6 ou posterior, aguarde um lote limitado em vez disso:

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

Isso pertence a um formulário existente com System.Linq e System.Threading.Tasks disponíveis. CheckProxyAsync faz entrada e saída assíncrona limitada e retorna um resultado; ela não manipula controles de uma thread em segundo plano. ShowResults e ShowCheckError são métodos da aplicação.

A continuação normal de await retorna ao contexto de UI onde o manipulador começou, então ShowResults pode atualizar controles. Código executado explicitamente em outra thread precisa encaminhar o acesso aos controles pelo mecanismo suportado do WinForms.

A lista de proxies gratuitos pode fornecer endereços de entrada; passe apenas protocolos implementados por CheckProxyAsync. Oito é um orçamento de exemplo. O próximo lote espera pela verificação mais lenta do lote atual, trocando alguma vazão por criação limitada de tarefas. Mantenha os prazos de cada verificação e o cancelamento em CheckProxyAsync; aguardar um lote não faz uma operação de rede ilimitada terminar.

Artigos relacionados