Kanselleer 'n hele WinForms-proksie-kontrolelop
Hou een kansellasiebron vir 'n WinForms-proksie-kontrolelop, dra kansellasie deur HTTP-werk en stop die lys se vordering.
Die Kanselleer-knoppie moet die lop stop. As elke proksiekontrole die kansellasie vang en normaal terugkeer, skuif die buitenste lus net na die volgende proksie. Dan lyk dit of Kanselleer niks gedoen het nie.
In moderne .NET WinForms hou een bron as 'n vormveld en laat kansellasie die gebeurtenishanteerder bereik:
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 die program se reeds ontleedde lys proksie-URI's. Rye uit die gratis proksielys kan 'n toegelate kontrole teen 'n publieke teiken voed; hou die protokol en gebruik net tipes wat hierdie hanteerder ondersteun. Die UI wag op elke bewerking, so die boodskap-lus bly beskikbaar vir die kanselleer-klik.
Dra die token na die netwerk
Die individuele kontrole moet daardie token aanvaar. 'n Verkorte HTTP-kontrole kan so lyk:
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 behoort aan die bestaande kontroleerder. Hou 'n gepaste perk op antwoordgrootte en 'n tydsbeperking vir daardie eindpunt. 'n Produksiekontroleerder kan kliënte per roete hergebruik; die fragment wys waar kansellasie beweeg, nie 'n verbindingspoel-ontwerp nie.
As mislukte proksies aangeteken en oorgeslaan moet word, vang verwagte netwerkfoute rondom die individuele kontrole. Laat lopende kansellasie na die buitenste hanteerder ontsnap. Vir parallelle kontroles, deel die lop-token met elke werker en wag vir hulle voltooiing voordat 'n nuwe lop geaktiveer word.