Parallel.ForEach وPLINQ
شغّل العمل بالتوازي باستخدام Parallel.ForEach، وأنشئ مسارات متوازية باستخدام PLINQ (AsParallel وWithDegreeOfParallelism وAsOrdered).
Parallel.ForEach وPLINQ درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.
لماذا الحلقات المتوازية
الهدف: استخدام المعالج بشكل أفضل.
- Parallel.ForEach: إجراء لكل عنصر
- PLINQ: استعلام متوازٍ مع عوامل تشغيل
- التحكم في درجة التوازي
- الحذر من الآثار الجانبية
أساسيات Parallel.ForEach
يوزّع Parallel.ForEach التكرارات على خيوط التنفيذ؛ ويشغّل الإجراء المحدد لكل عنصر.
using System;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
// Runs iterations concurrently on thread pool
Parallel.ForEach(data, x =>
{
int y = x * x; // small CPU work
Console.WriteLine("x=" + x + " y=" + y + " on " + Environment.CurrentManagedThreadId);
});
}
}
التحكم في التوازي
استخدم ParallelOptions.MaxDegreeOfParallelism للحد من التزامن عندما تكون الموارد محدودة.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
ParallelOptions opt = new ParallelOptions();
opt.MaxDegreeOfParallelism = 2; // limit concurrency
Parallel.ForEach(data, opt, x =>
{
Console.WriteLine("Start " + x);
Thread.Sleep(150); // simulate work
Console.WriteLine("Done " + x);
});
}
}
مسار PLINQ
يشغّل PLINQ عوامل تشغيل LINQ بالتوازي. ويستهلك ForAll النتائج بالتزامن ومن دون ترتيب.
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] nums = Enumerable.Range(1, 20).ToArray();
// Filter then project in parallel
var query =
nums
.AsParallel()
.WithDegreeOfParallelism(2)
.Where(n => n % 2 == 0)
.Select(n => n * n);
// ForAll consumes in parallel; order not guaranteed
query.ForAll(sq => Console.WriteLine(sq));
}
}
عناصر التحكم في الترتيب
استخدم AsOrdered للحفاظ على الترتيب؛ ويعيد AsSequential التبديل إلى LINQ أحادي الخيط عند الحاجة.
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] nums = new int[] { 5, 4, 3, 2, 1 };
// Preserve original sequence order for the output
var ordered =
nums.AsParallel().AsOrdered().Select(n => n * 10).ToArray();
// Switch back to sequential for a section if needed
var seq =
nums.AsParallel().Select(n => n + 1).AsSequential().Where(n => n > 3).ToArray();
Console.WriteLine("Ordered: " + string.Join(",", ordered));
Console.WriteLine("Sequential tail: " + string.Join(",", seq));
}
}
الأمان والنصائح
نصائح:
- تجنب الحالة المشتركة القابلة للتغيير؛ وفضّل الدوال النقية.
- استخدم مجموعات آمنة للخيوط إذا كان لا بد من الكتابة.
- نفّذ العمل على دفعات أكبر بدلًا من عناصر عمل صغيرة جدًا.
- قِس الأداء: يساعد التوازي في العمل المقيّد بالمعالج، لا في انتظار الإدخال والإخراج.
Parallel.ForEach مقابل PLINQ
مراجعة
مراجعة: استخدم Parallel.ForEach لتنفيذ إجراءات لكل عنصر؛ واستخدم PLINQ لبناء استعلامات متوازية والتحكم في التزامن، مع إمكانية الحفاظ على الترتيب.
الأسئلة الشائعة
هل درس «Parallel.ForEach وPLINQ» مجاني؟
نعم — نص درس «Parallel.ForEach وPLINQ» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.
ماذا ستتعلم في «Parallel.ForEach وPLINQ»؟
شغّل العمل بالتوازي باستخدام Parallel.ForEach، وأنشئ مسارات متوازية باستخدام PLINQ (AsParallel وWithDegreeOfParallelism وAsOrdered). تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.
كم من الوقت يستغرق درس «Parallel.ForEach وPLINQ»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Parallel.ForEach وPLINQ
- المنتِج/المستهلك باستخدام Channels (نظرة عامة)
- المفاضلة بين الإنتاجية وزمن الاستجابة