Task.WaitAll nun controlador de clic de WinForms bloquea a xanela aínda que as propias comprobacións usen HTTP asíncrono. O fío da UI non pode procesar mensaxes, e as continuacións capturadas poden necesitar ese mesmo fío bloqueado.

En .NET 6 ou posterior, espera no seu lugar un lote limitado:

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

Isto vai nun formulario existente con System.Linq e System.Threading.Tasks dispoñibles. CheckProxyAsync realiza E/S asíncrona limitada e devolve un resultado; non manipula controis desde un fío en segundo plano. ShowResults e ShowCheckError son métodos da aplicación.

A continuación normal de await volve ao contexto de UI onde comezou o controlador, así que ShowResults pode actualizar controis. O código que se executa explicitamente noutro fío debe facer chegar o acceso aos controis mediante o mecanismo compatíbel de WinForms.

A lista de proxies gratuítos pode fornecer enderezos de entrada; pasa só os protocolos que implementa CheckProxyAsync. Oito é un orzamento de exemplo. O seguinte lote espera a comprobación máis lenta do lote actual, trocando parte do rendemento por unha creación de tarefas limitada. Mantén os prazos de cada comprobación e a cancelación dentro de CheckProxyAsync; esperar un lote non pode facer que unha operación de rede ilimitada remate.

Artigos relacionados