Скасаваць увесь прагон праверкі проксі ў WinForms
Трымайце адну крыніцу скасавання для прогону праверкі проксі ў WinForms, перадавайце скасаванне праз HTTP-працу і спыніце прасоўванне спіса.
Кнопка «Скасаваць» павінна спыняць прагон. Калі кожная праверка проксі перахоплівае скасаванне і вяртаецца звычайна, знешні цыкл проста пераходзіць да наступнага проксі. Тады экран выглядае так, нібы скасаванне нічога не зрабіла.
У сучасным .NET WinForms трымайце адну крыніцу як поле формы і дазвольце скасаванню дайсці да апрацоўшчыка падзей:
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 — гэта ўжо разабраны спіс URI проксі ў праграме. Радкі з спіса бясплатных проксі могуць сілкаваць дазволеную праверку публічнай мэты; захоўвайце пратакол і выкарыстоўвайце толькі тыпы, якія падтрымлівае гэты апрацоўшчык. UI чакае кожную аперацыю, таму цыкл паведамленняў застаецца даступным для атрымання націску скасавання.
Перадайце токен у сетку
Асобная праверка павінна прымаць гэты токен. Скарочаная HTTP-праверка можа выглядаць так:
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 і RecordResult належаць існуючаму правяральніку. Трымайце належны ліміт памеру адказу і тайм-аўт для гэтай канечнай кропкі. Прамысловы правяральнік можа паўторна выкарыстоўваць кліентаў па маршруце; фрагмент паказвае, куды ідзе скасаванне, а не дызайн пула злучэнняў.
Калі няўдалыя проксі трэба запісваць і прапускаць, перахоплівайце чаканыя сеткавыя памылкі вакол асобнай праверкі. Дазвольце скасаванню прагону выйсці да знешняга апрацоўшчыка. Для паралельных праверак дзяліце токен прагону з кожным працоўным і чакайце іх завяршэння, перш чым дазволіць новы прагон.