Откажите цело покретање провере проксија у 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 припадају постојећем проверавачу. Одржавајте одговарајуће ограничење величине одговора и тајм-аут за тај ендпоинт. Продукцијски проверавач може поново користити клијенте по рути; исечак показује куда отказивање путује, а не дизајн пула веза.
Ако неуспеле проксије треба забележити и прескочити, хватајте очекиване мрежне грешке око појединачне провере. Пустите отказивање покретања да изађе до спољног руковаоца. За паралелне провере делите токен покретања са сваким радником и сачекајте њихово завршавање пре омогућавања новог покретања.