Anulo një ekzekutim të tërë kontrolli proxy në WinForms
Mbani një burim të vetëm anulimi për një ekzekutim kontrolli proxy në WinForms, përhapni anulimin në punën HTTP dhe ndaloni përparimin e listës.
Butoni Anulo duhet të ndalojë ekzekutimin. Nëse çdo kontroll proxy kap anulimin dhe kthehet normalisht, cikli i jashtëm thjesht kalon te proxyja tjetër. Atëherë ekrani duket sikur Anulo nuk bëri asgjë.
Në .NET WinForms modern, mbani një burim si fushë formulari dhe lërini anulimin të arrijë te trajtuesi i ngjarjes:
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 është lista e URI-ve të proxy-t që aplikacioni ka analizuar tashmë. Rreshtat nga lista e proxye falas mund të ushqejnë një kontroll të lejuar të një objektivi publik; ruani protokollin dhe përdorni vetëm llojet që mbështet ky trajtues. UI pret çdo operacion, kështu që cikli i mesazheve mbetet i lirë për të marrë klikimin e anulimit.
Çojeni tokenin në rrjet
Kontrolli individual duhet ta pranojë atë token. Një kontroll HTTP i shkurtuar mund të duket kështu:
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 dhe RecordResult i përkasin kontrolluesit ekzistues. Mbani një kufi të përshtatshëm të madhësisë së përgjigjes dhe një afat kohe për këtë pikë fundore. Një kontrollues prodhimi mund t'i ripërdorë klientët sipas rrugës; fragmenti tregon ku shkon anulimi, jo një dizajn të grupit të lidhjeve.
Nëse proxy-t e dështuara duhet të regjistrohen dhe anashkalohen, kapni dështimet e pritura të rrjetit rreth kontrollit individual. Lëreni anulimin e ekzekutimit të dalë te trajtuesi i jashtëm. Për kontrolle paralele, ndani tokenin e ekzekutimit me çdo punëtor dhe prisni përfundimin e tyre përpara se të aktivizoni një ekzekutim tjetër.