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 popisa.
Gumb Otkaži treba zaustaviti pokretanje. Ako svaka provjera proxyja uhvati otkazivanje i vrati se normalno, vanjska petlja jednostavno prelazi na sljedeći proxy. Tada zaslon izgleda kao da Otkaži nije učinio ništa.
U modernom .NET WinForms držite jedan izvor kao polje obrasca i pustite otkazivanje do rukovatelja 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ć parsirani popis proxy URI-ja u aplikaciji. Redovi s popisa besplatnih proxyja mogu hraniti dopuštenu provjeru javnog cilja; zadržite protokol i koristite samo vrste koje ovaj rukovatelj podržava. UI čeka svaku operaciju, pa petlja poruka ostaje slobodna za primanje klika 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 primjereno ograničenje veličine odgovora i vremensko ograničenje za taj endpoint. Produkcijski provjerivač može ponovno koristiti klijente po ruti; isječak pokazuje kamo otkazivanje putuje, a ne dizajn pula veza.
Ako neuspjele proxyje treba zabilježiti i preskočiti, hvatajte očekivane mrežne pogreške oko pojedinačne provjere. Pustite otkazivanje pokretanja da izađe do vanjskog rukovatelja. Za paralelne provjere dijelite token pokretanja sa svakim radnikom i pričekajte njihov završetak prije omogućavanja novog pokretanja.