Een volledige WinForms-proxycontrole afbreken
Houd één annuleringsbron bij voor een WinForms-proxycontrole, geef de annulering door aan het HTTP-werk en stop de voortgang van de lijst.
De knop Annuleren moet de uitvoering stoppen. Als elke proxycontrole de annulering opvangt en normaal terugkeert, gaat de buitenste lus gewoon door naar de volgende proxy. Dan lijkt het scherm alsof Annuleren niets heeft gedaan.
Houd in moderne .NET WinForms één bron als formulierveld en laat de annulering de gebeurtenishandler bereiken:
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 is de al geparseerde lijst met proxy-URI's van de toepassing. Rijen uit de gratis proxylijst kunnen een toegestane controle van een openbaar doel voeden; behoud het protocol en gebruik alleen typen die deze handler ondersteunt. De UI wacht op elke bewerking, zodat de berichtlus vrij blijft om de annuleringsklik te ontvangen.
Draag het token naar het netwerk
De afzonderlijke controle moet dat token accepteren. Een verkorte HTTP-controle kan er zo uitzien:
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 en RecordResult horen bij de bestaande controleur. Houd een passende limiet voor de responsgrootte en een time-out aan voor dat eindpunt. Een productiecontroleur kan clients per route hergebruiken; het fragment toont waar de annulering reist, niet een ontwerp voor een verbindingspool.
Als mislukte proxy's moeten worden vastgelegd en overgeslagen, vang dan verwachte netwerkfouten rond de afzonderlijke controle op. Laat de annulering van de uitvoering ontsnappen naar de buitenste handler. Deel bij parallelle controles het uitvoeringstoken met elke werker en wacht op hun voltooiing voordat een nieuwe uitvoering wordt ingeschakeld.