أوقف تجميد WinForms أثناء تشغيل فحوصات البروكسي
استبدل Task.WaitAll المتزامن في معالج حدث الواجهة بدفعات محدودة تُنتظر، ثم حدّث عناصر التحكم في سياق الواجهة بعد الاستئناف.
Task.WaitAll داخل معالج نقر في WinForms يجمّد النافذة حتى عندما تستخدم الفحوصات نفسها HTTP غير متزامن. لا يستطيع خيط الواجهة معالجة الرسائل، وقد تحتاج الاستمرارات الملتقطة إلى الخيط المحجوب نفسه.
في .NET 6 أو أحدث، انتظر دفعة محدودة بدلاً من ذلك:
private async void checkButton_Click(object sender, EventArgs e)
{
checkButton.Enabled = false;
try
{
var entries = proxyList.Lines
.Where(line => !string.IsNullOrWhiteSpace(line));
foreach (var batch in entries.Chunk(8))
{
var results = await Task.WhenAll(batch.Select(CheckProxyAsync));
ShowResults(results);
}
}
catch (Exception error)
{
ShowCheckError(error);
}
finally
{
checkButton.Enabled = true;
}
}هذا ينتمي إلى نموذج موجود مع توفر System.Linq وSystem.Threading.Tasks. ينفّذ CheckProxyAsync إدخالاً/إخراجاً غير متزامن محدوداً ويعيد نتيجة واحدة؛ ولا يتعامل مع عناصر التحكم من خيط خلفي. ShowResults وShowCheckError هما دالتان من التطبيق.
تعود استمرارية await العادية إلى سياق الواجهة حيث بدأ المعالج، لذا يستطيع ShowResults تحديث عناصر التحكم. أي شيفرة تعمل صراحة على خيط آخر يجب أن تمرّر الوصول إلى عناصر التحكم عبر آلية WinForms المدعومة.
يمكن أن توفّر قائمة البروكسي المجانية عناوين الإدخال؛ مرّر فقط البروتوكولات التي ينفّذها CheckProxyAsync. ثمانية ميزانية كمثال. تنتظر الدفعة التالية أبطأ فحص في الدفعة الحالية، مقايضة بعض الإنتاجية بإنشاء مهام محدود. أبقِ مواعيد كل فحص والإلغاء داخل CheckProxyAsync؛ فانتظار دفعة لا يجعل عملية شبكة غير محدودة تنتهي.