Ee ganzen WinForms-Proxy-Préifungslaf annuléieren
Halt eng eenzeg Annuléierungsquell fir e WinForms-Proxy-Préifungslaf, verbreed d'Annuléierung duerch HTTP-Aarbecht a stoppt de Fortschrëtt vun der Lëscht.
Den Annuléieren-Knäppchen soll de Laf stoppen. Wann all Proxy-Préifung d'Annuléierung fänkt an normal zréckkënnt, geet déi baussenzeg Schleif einfach op den nächsten Proxy. Dann gesäit den Ecran aus, wéi wann Annuléieren näischt gemaach hätt.
A modernem .NET WinForms hält eng Quell als Formfeld a loosst d'Annuléierung bis zum Event-Handler kommen:
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 ass déi schonn analyséiert Lëscht vun Proxy-URIen vun der Applikatioun. Zeilen aus der Lëscht vu gratis Proxien kënnen eng erlaabt Ëffentlech-Zil-Préifung ernähren; behält de Protokoll a benotz just Typen, déi dësen Handler ënnerstëtzt. D'UI waart op all Operatioun, sou datt d'Noriichteschleif fräi bleift, fir de Annuléierungs-Klick ze kréien.
D'Token bis an d'Netz droen
Déi eenzel Préifung muss dësen Token akzeptéieren. Eng verkierzt HTTP-Préifung kann esou ausgesinn:
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 a RecordResult gehéieren zum bestehende Prüfer. Halt eng passend Limite fir d'Äntwertgréisst an en Timeout fir dësen Endpunkt. E Produktiounsprüfer kann Clienten pro Route erëmbenotzen; de Fragment weist, wou d'Annuléierung reest, net e Verbindungspool-Design.
Wann feelgeschloen Proxien opgeholl a iwwersprunge solle ginn, fänk déi erwaart Netzwierkfehler ronderëm déi eenzel Préifung. Loosst d'Annuléierung vum Laf bis zum baussenzegen Handler entkommen. Fir parallel Préifungen deelt den Laf-Token mat all Aarbechter a waart op hir Ofschloss, ier en anere Laf aktivéiert gëtt.