تكرار السؤال: …
الإجابة المختصرة
الـ Task.WhenAll غير حاجزة وتعيد Task يمكن انتظاره بـ await دون تعطيل الخيط، بينما Task.WaitAll متزامنة وتحجب الخيط بالكامل حتى اكتمال جميع المهام.
الشرح
لتشغيل عدة طلبات خارجية بالتوازي (مثل جلب بيانات مستخدم، ورصيده، وسجل طلباته في نفس اللحظة)، تطلق المهام وتجمعها في مصفوفة. استخدام await Task.WhenAll(t1, t2, t3) يحرر خيط الخادم لخدمة عملاء آخرين حتى تنتهي العمليات الثلاث. في المقابل، فإن Task.WaitAll تجمد الخيط الحالي في مكانها مسببة استنزاف الـ ThreadPool.
مثال بالكود
var userTask = userService.GetAsync(id);
var ordersTask = orderService.GetAsync(id);
// تنفيذ متوازي حقيقي دون حجب الخيط
await Task.WhenAll(userTask, ordersTask);
var user = await userTask;
var orders = await ordersTask;أخطاء شائعة
- استخدام await أمام كل مهمة فور استدعائها (await task1; await task2;) مما يجعلها تنفذ متسلسلة ويلغي التوازي تماماً.