Cancel·leu tota una execució de comprovació de proxys a WinForms
Mantingueu una sola font de cancel·lació per a una execució de comprovació de proxys a WinForms, propagueu la cancel·lació pel treball HTTP i atureu l'avanç de la llista.
El botó Cancel·la hauria d'aturar l'execució. Si cada comprovació de proxy captura la cancel·lació i torna normalment, el bucle exterior simplement passa al proxy següent. Llavors la pantalla sembla com si Cancel·la no hagués fet res.
A WinForms modern de .NET, mantingueu una sola font com a camp del formulari i deixeu que la cancel·lació arribi al gestor d'esdeveniments:
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 és la llista d'URI de proxy que l'aplicació ja ha analitzat. Les files de la llista de proxys gratuïts poden alimentar una comprovació permesa d'un objectiu públic; conserveu el protocol i useu només tipus que admeti aquest gestor. La UI espera cada operació, així que el bucle de missatges queda lliure per rebre el clic de cancel·lació.
Porteu el testimoni a la xarxa
La comprovació individual ha d'acceptar aquest testimoni. Una comprovació HTTP abreujada pot semblar així:
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 i RecordResult pertanyen al comprovador existent. Mantingueu un límit adequat de mida de resposta i un temps d'espera per a aquest punt final. Un comprovador de producció pot reutilitzar clients per ruta; el fragment mostra on viatja la cancel·lació, no un disseny de pool de connexions.
Si els proxys fallits s'han de registrar i ometre, captureu les fallades de xarxa esperades al voltant de la comprovació individual. Deixeu que la cancel·lació de l'execució surti al gestor exterior. Per a comprovacions paral·leles, compartiu el testimoni d'execució amb cada treballador i espereu que acabin abans d'habilitar una altra execució.