إلغاء تشغيل كامل لفحص البروكسي في 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 للبروكسي التي حللتها التطبيق مسبقًا. يمكن لصفوف من قائمة البروكسي المجاني أن تغذي فحصًا مسموحًا بهدف عام؛ حافظ على البروتوكول واستخدم فقط الأنواع التي يدعمها هذا المعالج. تنتظر الواجهة كل عملية، لذلك تبقى حلقة الرسائل متاحة لاستقبال نقرة الإلغاء.
مرّر الرمز إلى الشبكة
يجب أن يقبل الفحص الفردي ذلك الرمز. قد يبدو فحص 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 ينتميان إلى الفاحص الحالي. احتفظ بحد مناسب لحجم الاستجابة ومهلة لهذه النقطة. يمكن لفاحص الإنتاج إعادة استخدام العملاء حسب المسار؛ يوضح المقتطف أين ينتقل الإلغاء، لا تصميم تجمع اتصالات.
إذا كان يجب تسجيل البروكسيات الفاشلة وتخطيها، فالتقط أخطاء الشبكة المتوقعة حول الفحص الفردي. دع إلغاء التشغيل يخرج إلى المعالج الخارجي. للفحوص المتوازية، شارك رمز التشغيل مع كل عامل وانتظر اكتمالها قبل تمكين تشغيل آخر.