İptal düğmesi çalıştırmayı durdurmalıdır. Her proxy denetimi iptali yakalayıp normal dönerse, dış döngü yalnızca bir sonraki proxy'ye geçer. O zaman ekran, İptal hiçbir şey yapmamış gibi görünür.

Modern .NET WinForms'ta tek bir kaynağı form alanı olarak tutun ve iptalin olay işleyicisine ulaşmasına izin verin:

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, uygulamanın önceden ayrıştırdığı proxy URI listesidir. ücretsiz proxy listesindeki satırlar izin verilen bir genel hedef denetimini besleyebilir; protokolü koruyun ve yalnızca bu işleyicinin desteklediği türleri kullanın. UI her işlemi bekler, böylece mesaj döngüsü iptal tıklamasını almaya açık kalır.

Belirteci ağa taşıyın

Bireysel denetim bu belirteci kabul etmelidir. Kısaltılmış bir HTTP denetimi şöyle görünebilir:

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 ve RecordResult mevcut denetleyiciye aittir. Bu uç nokta için uygun bir yanıt boyutu sınırı ve zaman aşımı tutun. Üretim denetleyicisi istemcileri rotaya göre yeniden kullanabilir; parça, iptalin nereye gittiğini gösterir, bağlantı havuzu tasarımını değil.

Başarısız proxy'ler kaydedilip atlanacaksa, bireysel denetimin çevresinde beklenen ağ hatalarını yakalayın. Çalıştırma iptalinin dış işleyiciye kaçmasına izin verin. Paralel denetimler için çalıştırma belirtecini her çalışanla paylaşın ve başka bir çalıştırmayı etkinleştirmeden önce tamamlanmalarını bekleyin.

İlgili makaleler