Otkažite cijelo pokretanje provjere proxyja u WinForms
Držite jedan izvor otkazivanja za pokretanje provjere proxyja u WinForms, širite otkazivanje kroz HTTP rad i zaustavite napredovanje liste.
Dugme Otkaži treba zaustaviti pokretanje. Ako svaka provjera proxyja uhvati otkazivanje i vrati se normalno, vanjska petlja jednostavno prelazi na sljedeći proxy. Tada ekran izgleda kao da Otkaži nije učinio ništa.
U modernom .NET WinForms držite jedan izvor kao polje forme i pustite otkazivanje do rukovaoca događaja:
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 je već parsirana lista proxy URI-jeva u aplikaciji. Redovi iz liste besplatnih proxyja mogu hraniti dozvoljenu provjeru javnog cilja; zadržite protokol i koristite samo tipove koje ovaj rukovalac podržava. UI čeka svaku operaciju, pa poruka-petlja ostaje slobodna da primi klik otkazivanja.
Prenesite token do mreže
Pojedinačna provjera mora prihvatiti taj token. Skraćena HTTP provjera može izgledati ovako:
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 pripadaju postojećem provjerivaču. Održavajte odgovarajuće ograničenje veličine odgovora i tajm-aut za taj endpoint. Produkcijski provjerivač može ponovo koristiti klijente po ruti; isječak pokazuje kuda otkazivanje putuje, a ne dizajn pula veza.
Ako neuspjele proxyje treba zabilježiti i preskočiti, hvatajte očekivane mrežne greške oko pojedinačne provjere. Pustite otkazivanje pokretanja da izađe do vanjskog rukovaoca. Za paralelne provjere dijelite token pokretanja sa svakim radnikom i sačekajte njihovo završavanje prije omogućavanja novog pokretanja.