Avbryt ein heil WinForms-proxykontroll
Hald éin avbrytingskjelde for ein WinForms-proxykontroll, før avbrytinga gjennom HTTP-arbeidet og stopp framdrifta til lista.
Avbryt-knappen skal stoppe køyringa. Viss kvar proxykontroll fangar avbrytinga og kjem normalt tilbake, går den ytre løkka berre vidare til neste proxy. Då ser skjermen ut som om Avbryt ikkje gjorde noko.
I moderne .NET WinForms held du éi kjelde som eit skjemafelt og lèt avbrytinga nå hendingshandteraren:
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 er den allereie parsede lista til programmet over proxy-URI-ar. Radar frå lista over gratis proxyar kan fôre ein tillaten kontroll av eit offentleg mål; hald på protokollen og bruk berre typar som denne handteraren støttar. UI-en ventar på kvar operasjon, så meldingsløkka held fram med å vere ledig for å ta imot avbryt-klikket.
Før tokenet til nettverket
Den einskilde kontrollen må godta dette tokenet. Ein forkorta HTTP-kontroll kan sjå slik ut:
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 og RecordResult høyrer til den eksisterande kontrolløren. Hald ei høveleg grense for svarstorleik og ein tidsfrist for dette endepunktet. Ein produksjonskontrollør kan bruke klientar om att per rute; utdraget viser kvar avbrytinga reiser, ikkje eit tilkoplingsbasseng-design.
Viss mislykka proxyar skal registrerast og hoppast over, fangar du forventa nettverksfeil rundt den einskilde kontrollen. Lat avbrytinga av køyringa sleppe ut til den ytre handteraren. For parallelle kontrollar deler du køyringstokenet med kvar arbeidar og ventar på at dei fullfører før ei ny køyring blir slått på.