Pare de bloquear o WinForms enquanto as verificações de proxy executam
Substitua um Task.WaitAll síncrono no manipulador de evento da UI por lotes limitados e aguardados e depois atualize os controles no contexto de UI retomado.
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.