Preklic celotnega zagona preverjanja proxyja v WinForms
Za zagon preverjanja proxyja v WinForms ohranite en vir preklica, preklic prenesite v delo HTTP in ustavite napredovanje seznama.
Gumb Prekliči mora ustaviti zagon. Če vsako preverjanje proxyja ujame preklic in se vrne običajno, zunanja zanka preprosto preide na naslednji proxy. Zaslon je takrat videti, kot da Prekliči ni storil ničesar.
V sodobnem .NET WinForms ohranite en vir kot polje obrazca in dovolite, da preklic doseže obravnavo dogodka:
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 že razčlenjen seznam URI proxyjev v aplikaciji. Vrstice s seznama brezplačnih proxyjev lahko napajajo dovoljeno preverjanje javnega cilja; ohranite protokol in uporabljajte samo vrste, ki jih ta obravnava podpira. UI čaka na vsako operacijo, zato zanka sporočil ostane prosta za sprejem klika preklica.
Prenesite žeton v omrežje
Posamezno preverjanje mora sprejeti ta žeton. Skrajšano preverjanje HTTP je lahko videti takole:
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 in RecordResult pripadata obstoječemu preverjevalniku. Ohranite ustrezno omejitev velikosti odgovora in časovno omejitev za to končno točko. Produkcijski preverjevalnik lahko znova uporabi odjemalce po poti; izsek prikazuje, kam potuje preklic, ne zasnove bazena povezav.
Če je neuspešne proxyje treba zabeležiti in preskočiti, ujemite pričakovane omrežne napake okoli posameznega preverjanja. Pustite, da preklic zagona uide do zunanje obravnave. Pri vzporednih preverjanjih delite žeton zagona z vsakim delavcem in počakajte na njihov dokončanje, preden omogočite drug zagon.