Avbryt en hel WinForms-proxykörning
Behåll en enda avbrottskälla för en WinForms-proxykörning, sprid avbrottet genom HTTP-arbetet och stoppa listans framdrift.
Knappen Avbryt ska stoppa körningen. Om varje proxykontroll fångar avbrottet och återvänder normalt, går den yttre slingan bara vidare till nästa proxy. Då ser skärmen ut som om Avbryt inte gjorde något.
I moderna .NET WinForms behåller du en källa som ett formulärfält och låter avbrottet nå händelsehanteraren:
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 är programmets redan parsade lista över proxy-URI:er. Rader från listan över gratisproxyer kan mata en tillåten kontroll av ett offentligt mål; behåll protokollet och använd bara typer som hanteraren stöder. UI:t väntar på varje operation, så meddelandelopen förblir fri att ta emot avbrottsklicket.
Bär token till nätverket
Den enskilda kontrollen måste acceptera den token. En förkortad HTTP-kontroll kan se ut så här:
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 och RecordResult tillhör den befintliga kontrollen. Behåll en lämplig gräns för svarstorlek och en tidsgräns för den slutpunkten. En produktionskontroll kan återanvända klienter per rutt; utdraget visar var avbrottet färdas, inte en anslutningspool-design.
Om misslyckade proxyer ska registreras och hoppas över, fånga förväntade nätverksfel runt den enskilda kontrollen. Låt körningens avbrott fly till den yttre hanteraren. För parallella kontroller delar du körningens token med varje arbetare och väntar på att de blir klara innan en ny körning aktiveras.