Cancelar toda unha execución de comprobación de proxies en WinForms
Manteña unha única fonte de cancelación para unha execución de comprobación de proxies en WinForms, propague a cancelación polo traballo HTTP e deteña o avance da lista.
O botón Cancelar debería deter a execución. Se cada comprobación de proxy captura a cancelación e volve con normalidade, o bucle exterior simplemente pasa ao seguinte proxy. Entón a pantalla parece como se Cancelar non fixese nada.
En WinForms moderno de .NET, manteña unha soa fonte como campo do formulario e deixe que a cancelación chegue ao xestor de eventos:
private CancellationTokenSource? activeRun;
private async void startButton_Click(object sender, EventArgs e)
{
if (activeRun is not null) return;
using var run = new CancellationTokenSource();
activeRun = run;
startButton.Enabled = false;
try
{
foreach (Uri proxy in configuredProxies)
{
run.Token.ThrowIfCancellationRequested();
await CheckProxyAsync(proxy, run.Token);
}
statusLabel.Text = "Finished";
}
catch (OperationCanceledException) when (run.IsCancellationRequested)
{
statusLabel.Text = "Stopped";
}
finally
{
activeRun = null;
startButton.Enabled = true;
}
}
private void cancelButton_Click(object sender, EventArgs e)
=> activeRun?.Cancel();configuredProxies é a lista de URI de proxy que a aplicación xa analizou. As filas da lista de proxies gratuítos poden alimentar unha comprobación permitida dun obxectivo público; conserve o protocolo e use só tipos que admita este xestor. A UI espera cada operación, así que o bucle de mensaxes queda libre para recibir o clic de cancelación.
Leve o token á rede
A comprobación individual debe aceptar ese token. Unha comprobación HTTP abreviada pode verse así:
private async Task CheckProxyAsync(Uri proxy, CancellationToken token)
{
using var handler = new HttpClientHandler
{
Proxy = new System.Net.WebProxy(proxy),
UseProxy = true
};
using var client = new HttpClient(handler);
using var response = await client.GetAsync(
probeUri, HttpCompletionOption.ResponseHeadersRead, token);
response.EnsureSuccessStatusCode();
string body = await response.Content.ReadAsStringAsync(token);
RecordResult(proxy, body);
}probeUri e RecordResult pertencen ao comprobador existente. Manteña un límite axeitado de tamaño de resposta e un tempo de espera para ese punto final. Un comprobador de produción pode reutilizar clientes por ruta; o fragmento mostra por onde viaxa a cancelación, non un deseño de pool de conexións.
Se os proxies fallidos deben rexistrarse e omitirse, capture os fallos de rede esperados arredor da comprobación individual. Deixe que a cancelación da execución escape ao xestor exterior. Para comprobacións en paralelo, comparta o token de execución con cada traballador e espere a que rematen antes de habilitar outra execución.