Скасувати весь прогін перевірки проксі у 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 належать наявному перевіряльнику. Тримайте належну межу розміру відповіді й тайм-аут для цієї кінцевої точки. Виробничий перевіряльник може повторно використовувати клієнтів за маршрутом; фрагмент показує, куди рухається скасування, а не дизайн пулу з'єднань.
Якщо невдалі проксі треба записувати й пропускати, перехоплюйте очікувані мережеві помилки навколо окремої перевірки. Дозвольте скасуванню прогону вийти до зовнішнього обробника. Для паралельних перевірок діліть токен прогону з кожним працівником і чекайте на їхнє завершення, перш ніж дозволити новий прогін.