Cancelar toda una ejecución de comprobación de proxies en WinForms
Mantenga una sola fuente de cancelación para una ejecución de comprobación de proxies en WinForms, propague la cancelación por el trabajo HTTP y detenga el avance de la lista.
El botón Cancelar debe detener la ejecución. Si cada comprobación de proxy captura la cancelación y vuelve con normalidad, el bucle exterior simplemente pasa al siguiente proxy. Entonces la pantalla parece como si Cancelar no hubiera hecho nada.
En WinForms moderno de .NET, mantenga una sola fuente como campo del formulario y deje que la cancelación llegue al controlador 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 es la lista de URI de proxy que la aplicación ya ha analizado. Las filas de la lista de proxies gratuitos pueden alimentar una comprobación permitida de un objetivo público; conserve el protocolo y use solo tipos que admita este controlador. La UI espera cada operación, así que el bucle de mensajes queda libre para recibir el clic de cancelación.
Lleve el token a la red
La comprobación individual debe aceptar ese token. Una comprobación HTTP abreviada puede 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 y RecordResult pertenecen al comprobador existente. Mantenga un límite adecuado de tamaño de respuesta y un tiempo de espera para ese punto final. Un comprobador de producción puede reutilizar clientes por ruta; el fragmento muestra por dónde viaja la cancelación, no un diseño de grupo de conexiones.
Si los proxies fallidos deben registrarse y omitirse, capture los fallos de red esperados alrededor de la comprobación individual. Deje que la cancelación de la ejecución escape al controlador exterior. Para comprobaciones en paralelo, comparta el token de ejecución con cada trabajador y espere a que terminen antes de habilitar otra ejecución.