Einen gesamten WinForms-Proxy-Prüflauf abbrechen
Eine Abbruchquelle für einen WinForms-Proxy-Prüflauf beibehalten, den Abbruch durch HTTP-Arbeit weiterreichen und das Fortschreiten der Liste stoppen.
Die Schaltfläche „Abbrechen“ sollte den Lauf beenden. Wenn jede Proxy-Prüfung den Abbruch abfängt und normal zurückkehrt, rückt die äußere Schleife einfach zum nächsten Proxy vor. Dann sieht der Bildschirm aus, als hätte Abbrechen nichts bewirkt.
In modernem .NET WinForms eine Quelle als Formularfeld halten und den Abbruch bis zum Ereignishandler gelangen lassen:
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 ist die bereits geparste Liste von Proxy-URIs der Anwendung. Zeilen aus der Liste kostenloser Proxys können eine erlaubte Prüfung eines öffentlichen Ziels speisen; das Protokoll beibehalten und nur Typen verwenden, die dieser Handler unterstützt. Die UI wartet auf jeden Vorgang, daher bleibt die Nachrichtenschleife frei, um den Abbruch-Klick zu empfangen.
Das Token ins Netzwerk tragen
Die einzelne Prüfung muss dieses Token annehmen. Eine verkürzte HTTP-Prüfung kann so aussehen:
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 und RecordResult gehören zum vorhandenen Prüfer. Eine angemessene Obergrenze für die Antwortgröße und ein Timeout für diesen Endpunkt beibehalten. Ein Produktionsprüfer kann Clients pro Route wiederverwenden; das Fragment zeigt, wohin der Abbruch wandert, kein Verbindungspool-Design.
Sollen fehlgeschlagene Proxys erfasst und übersprungen werden, erwartete Netzwerkfehler um die einzelne Prüfung herum abfangen. Den Abbruch des Laufs zum äußeren Handler entweichen lassen. Bei parallelen Prüfungen das Lauf-Token mit jedem Worker teilen und deren Abschluss abwarten, bevor ein neuer Lauf aktiviert wird.