Atšaukti visą WinForms proxy tikrinimo eigą
Laikykite vieną atšaukimo šaltinį WinForms proxy tikrinimo eigai, perduokite atšaukimą HTTP darbui ir sustabdykite sąrašo eigą.
Mygtukas Atšaukti turėtų sustabdyti eigą. Jei kiekviena proxy patikra pagauna atšaukimą ir grįžta įprastai, išorinė kilpa tiesiog pereina prie kito proxy. Tada ekranas atrodo taip, lyg Atšaukti nieko nepadarė.
Šiuolaikiniame .NET WinForms laikykite vieną šaltinį kaip formos lauką ir leiskite atšaukimui pasiekti įvykio apdorotoją:
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 yra jau išanalizuotas programos proxy URI sąrašas. Eilutės iš nemokamų proxy sąrašo gali maitinti leidžiamą viešo taikinio patikrą; išsaugokite protokolą ir naudokite tik šio apdorotojo palaikomus tipus. UI laukia kiekvienos operacijos, todėl pranešimų kilpa lieka laisva priimti atšaukimo paspaudimą.
Perduokite žetoną į tinklą
Atskira patikra turi priimti tą žetoną. Sutrumpinta HTTP patikra gali atrodyti taip:
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 ir RecordResult priklauso esamam tikrintuvui. Laikykite tinkamą atsakymo dydžio ribą ir skirtąjį laiką šiam galiniam taškui. Gamybinis tikrintuvas gali pakartotinai naudoti klientus pagal maršrutą; iškarpa rodo, kur keliauja atšaukimas, o ne jungčių telkinio dizainą.
Jei nepavykusius proxy reikia įrašyti ir praleisti, pagaukite numatomus tinklo gedimus aplink atskirą patikrą. Leiskite eigos atšaukimui pabėgti į išorinį apdorotoją. Lygiagrečių patikrų atveju bendrinkite eigos žetoną su kiekvienu darbuotoju ir palaukite jų pabaigos prieš įjungdami kitą eigą.