Nuligi tutan WinForms-prokse kontroladon
Tenu unu nuligfonto por WinForms-prokse kontrolado, disvastigu nuligon tra HTTP-laboro kaj haltigu la progresadon de la listo.
La butono Nuligi devus haltigi la ekzekuton. Se ĉiu prokse-kontrolo kaptas la nuligon kaj revenas normale, la ekstera buklo simple antaŭeniras al la sekva prokseo. Tiam la ekrano aspektas kvazaŭ Nuligi faris nenion.
En moderna .NET WinForms, tenu unu fonton kiel forman kampon kaj lasu la nuligon atingi la eventtraktilon:
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 estas la jam analizita listo de prokseaj URI-oj de la aplikaĵo. Vicoj el la senpaga proksea listo povas nutri permesitan kontrolon de publika celo; konservu la protokolon kaj uzu nur tipojn subtenatajn de ĉi tiu traktilo. La UI atendas ĉiun operacion, do la mesaĝbuklo restas libera por ricevi la nuligan klakon.
Portu la ĵetonon al la reto
La unuopa kontrolo devas akcepti tiun ĵetonon. Mallongigita HTTP-kontrolo povas aspekti tiel:
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 kaj RecordResult apartenas al la ekzistanta kontrolilo. Tenu taŭgan limon por respondgrandeco kaj tempolimon por tiu finpunkto. Produkta kontrolilo povas reuzi klientojn laŭ itinero; la fragmento montras, kien vojaĝas nuligo, ne dezajnon de konekta naĝejo.
Se malsukcesaj prokseoj estu registrataj kaj preterpasataj, kaptu atendatajn retajn fiaskojn ĉirkaŭ la unuopa kontrolo. Lasu la nuligon de la ekzekuto eskapi al la ekstera traktilo. Por paralelaj kontroloj, dividu la ekzekutan ĵetonon kun ĉiu laboranto kaj atendu ilian finiĝon antaŭ ol ebligi alian ekzekuton.