Le bouton Annuler doit arrêter l'exécution. Si chaque vérification de proxy intercepte l'annulation et revient normalement, la boucle externe passe simplement au proxy suivant. L'écran donne alors l'impression qu'Annuler n'a rien fait.

Dans WinForms .NET moderne, gardez une seule source comme champ du formulaire et laissez l'annulation atteindre le gestionnaire d'événements :

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 est la liste d'URI de proxy déjà analysée par l'application. Les lignes de la liste de proxys gratuits peuvent alimenter une vérification autorisée d'une cible publique ; conservez le protocole et n'utilisez que les types pris en charge par ce gestionnaire. L'interface attend chaque opération, donc la boucle de messages reste libre pour recevoir le clic d'annulation.

Portez le jeton jusqu'au réseau

La vérification individuelle doit accepter ce jeton. Une vérification HTTP abrégée peut ressembler à ceci :

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 et RecordResult appartiennent au vérificateur existant. Conservez une limite adaptée de taille de réponse et un délai d'expiration pour ce point de terminaison. Un vérificateur de production peut réutiliser des clients par route ; l'extrait montre où circule l'annulation, pas une conception de pool de connexions.

Si les proxys en échec doivent être enregistrés et ignorés, interceptez les erreurs réseau attendues autour de la vérification individuelle. Laissez l'annulation de l'exécution remonter au gestionnaire externe. Pour des vérifications parallèles, partagez le jeton d'exécution avec chaque worker et attendez leur fin avant d'autoriser une autre exécution.

Articles similaires