გაუქმების ღილაკმა უნდა შეაჩეროს გაშვება. თუ ყოველი პროქსის შემოწმება იჭერს გაუქმებას და ნორმალურად ბრუნდება, გარე ციკლი უბრალოდ გადადის შემდეგ პროქსიზე. მაშინ ეკრანი ისე გამოიყურება, თითქოს გაუქმებამ არაფერი გააკეთა.

თანამედროვე .NET WinForms-ში შეინახეთ ერთი წყარო ფორმის ველად და მიეცით გაუქმებას მოვლენის დამმუშავებლამდე მისვლის საშუალება:

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 არის აპლიკაციის მიერ უკვე დამუშავებული პროქსი URI-ების სია. უფასო პროქსი სიის სტრიქონები შეიძლება კვებავდეს დაშვებულ საჯარო სამიზნის შემოწმებას; შეინარჩუნეთ პროტოკოლი და გამოიყენეთ მხოლოდ ის ტიპები, რომლებსაც ეს დამმუშავებელი უჭერს მხარს. UI ელოდება ყოველ ოპერაციას, ამიტომ შეტყობინებების ციკლი თავისუფალი რჩება გაუქმების დაწკაპუნების მისაღებად.

ტოკენი ქსელამდე მიიტანეთ

ცალკეულმა შემოწმებამ უნდა მიიღოს ეს ტოკენი. შემოკლებული HTTP შემოწმება შეიძლება ასე გამოიყურებოდეს:

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 და RecordResult ეკუთვნის არსებულ შემმოწმებელს. შეინარჩუნეთ პასუხის ზომის შესაბამისი ზღვარი და ვადა ამ საბოლოო წერტილისთვის. წარმოების შემმოწმებელს შეუძლია კლიენტების ხელახლა გამოყენება მარშრუტის მიხედვით; ფრაგმენტი აჩვენებს, სად მოძრაობს გაუქმება, და არა კავშირების აუზის დიზაინს.

თუ წარუმატებელი პროქსები უნდა ჩაიწეროს და გამოტოვდეს, დაიჭირეთ მოსალოდნელი ქსელური ხარვეზები ცალკეული შემოწმების გარშემო. მისცეთ გაშვების გაუქმებას გარე დამმუშავებლამდე გასვლის საშუალება. პარალელური შემოწმებებისთვის გააზიარეთ გაშვების ტოკენი ყოველ მუშაკთან და დაელოდეთ მათ დასრულებას სხვა გაშვების ჩართვამდე.

დაკავშირებული სტატიები