Anulowanie całego przebiegu sprawdzania proxy w WinForms
Utrzymuj jedno źródło anulowania przebiegu sprawdzania proxy w WinForms, propaguj anulowanie do pracy HTTP i zatrzymaj przesuwanie listy.
Przycisk Anuluj powinien zatrzymać przebieg. Jeśli każde sprawdzenie proxy przechwyci anulowanie i wróci normalnie, zewnętrzna pętla po prostu przejdzie do następnego proxy. Wtedy ekran wygląda, jakby Anuluj nic nie zrobił.
W nowoczesnym .NET WinForms trzymaj jedno źródło jako pole formularza i pozwól anulowaniu dotrzeć do procedury obsługi zdarzenia:
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 to już przeanalizowana lista URI proxy w aplikacji. Wiersze z listy darmowych proxy mogą zasilać dozwolone sprawdzenie celu publicznego; zachowaj protokół i używaj tylko typów obsługiwanych przez tę procedurę. Interfejs czeka na każdą operację, więc pętla komunikatów pozostaje wolna, by odebrać kliknięcie anulowania.
Przenieś token do sieci
Pojedyncze sprawdzenie musi przyjąć ten token. Skrócone sprawdzenie HTTP może wyglądać tak:
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 należą do istniejącego sprawdzacza. Utrzymuj odpowiedni limit rozmiaru odpowiedzi i limit czasu dla tego punktu końcowego. Sprawdzacz produkcyjny może ponownie używać klientów według trasy; fragment pokazuje, dokąd wędruje anulowanie, a nie projekt puli połączeń.
Jeśli nieudane proxy mają być zapisywane i pomijane, przechwytuj oczekiwane błędy sieci wokół pojedynczego sprawdzenia. Pozwól anulowaniu przebiegu uciec do zewnętrznej procedury. W przypadku sprawdzeń równoległych udostępniaj token przebiegu każdemu pracownikowi i czekaj na ich zakończenie przed włączeniem kolejnego przebiegu.