Deixa de bloquear WinForms mentres se executan as comprobacións de proxy
Substitúe o Task.WaitAll síncrono do controlador de eventos da UI por lotes limitados esperados e despois actualiza os controis no contexto de UI retomado.
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.