تكرار السؤال: …
الإجابة المختصرة
توفر دالة رسمية لتنفيذ مجموعة عناصر متوازية مع كود async وتحديد سقف دقيق لعدد الخيوط المتزامنة بـ MaxDegreeOfParallelism ودعم الإلغاء.
الشرح
قديماً كان Parallel.ForEach الكلاسيكي محصوراً في الكود المتزامن فقط ويحجب الخيوط. أضافت .NET ميزة Parallel.ForEachAsync المصممة للـ async/await؛ حيث تتيح معالجة مصفوفة ضخمة مع تقييد عدد المهام غير المتزامنة التي تجري في نفس اللحظة (مثلاً 8 مهام بالتوازي) وتمرير CancellationToken لإلغاء المعالجة فوراً.
مثال بالكود
await Parallel.ForEachAsync(urls, new ParallelOptions { MaxDegreeOfParallelism = 8 }, async (url, ct) => {
var content = await httpClient.GetStringAsync(url, ct);
await ProcessContentAsync(content, ct);
});أخطاء شائعة
- استخدام Parallel.ForEach الكلاسيكي القديم مع كود غير متزامن عبر async void داخل المعامل مما يفشل في انتظار العمليات.
أسئلة متابعة
- كيف تمرر وتتعامل مع CancellationToken في سلاسل استدعاءات الدوال غير المتزامنة بـ ASP.NET Core؟
- ما الفرق الجوهري بين ThreadLocal<T> و AsyncLocal<T> في بيئات المعالجة غير المتزامنة بـ .NET؟