কম্পিউটার টিউটোরিয়াল

C#-তে Foreach এবং Parallel.Foreach-এর পার্থক্য

মূল পার্থক্য

বিষয়foreachParallel.ForEach
থ্রেডিংসিঙ্গেল থ্রেডমাল্টিপল থ্রেড (থ্রেড পুল)
এক্সিকিউশনসিকোয়েনশিয়াল (এক-এক করে)প্যারালেল (একসাথে একাধিক)
গতিधीম (CPU-বাউন্ড কাজের জন্য)দ্রুত (মাল্টিকোর CPU-এর সুবিধা নেয়)
নেমস্পেসSystem (বিল্ট-ইন)System.Threading.Tasks
অর্ডার গ্যারান্টিহ্যাঁ (ইনপুট অর্ডার)না (অর্ডার নিশ্চিত নয়)
এক্সেপশন হ্যান্ডলিংসহজAggregateException হ্যান্ডলিং দরকার

নেমস্পেস

using System.Threading.Tasks;

উদাহরণ: পারফরম্যান্স তুলনা

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace DemoApplication {
    class Demo {
        static void Main(string[] args) {
            var animals = new List<string> {
                "cat", "rat", "deer", "elephant", "lion", "tiger", "dog", "pig",
                "buffalo", "rabbit", "horse", "cheetah", "cow", "goat", "sheep",
                "donkey", "zebra", "wolf", "fox", "leopard", "monkey", "kangaroo",
                "giraffe", "hippo"
            };
            
            // সাধারণ foreach
            var sw1 = Stopwatch.StartNew();
            foreach (string animal in animals) {
                SimulateWork(animal);
            }
            Console.WriteLine($"foreach টাইম: {sw1.Elapsed.TotalMilliseconds:F2} ms");
            
            // Parallel.ForEach
            var sw2 = Stopwatch.StartNew();
            Parallel.ForEach(animals, animal => {
                SimulateWork(animal);
            });
            Console.WriteLine($"Parallel.ForEach টাইম: {sw2.Elapsed.TotalMilliseconds:F2} ms");
            
            Console.ReadLine();
        }
        
        static void SimulateWork(string name) {
            Thread.Sleep(50); // কাজ অনুকরণ
            Console.WriteLine($"{name} - Thread: {Thread.CurrentThread.ManagedThreadId}");
        }
    }
}

সম্ভাব্য আউটপুট:

foreach টাইম: 1250.45 ms
cat - Thread: 1
rat - Thread: 1
...
Parallel.ForEach টাইম: 320.12 ms
cat - Thread: 1
dog - Thread: 3
lion - Thread: 4
... (অর্ডার ভিন্ন হতে পারে)

Parallel.ForEach-র অপশনস


// ডিগ্রি অফ প্যারালেলিজম সীমাবদ্ধ করা
Parallel.ForEach(items, new ParallelOptions { MaxDegreeOfParallelism = 4 }, item => {
    // একসাথে সর্বোচ্চ ৪ থ্রেড
});

// ব্রেক/স্টপ করা
Parallel.ForEach(items, (item, state) => {
    if (item == "stop") state.Stop(); // বা state.Break();
});

কখন কোনটি ব্যবহার করবেন?

  • foreach: ছোট কালেকশন, I/O-বাউন্ড কাজ, অর্ডার গুরুত্বপূর্ণ, সিম্পল লজিক
  • Parallel.ForEach: বড় কালেকশন, CPU-বাউন্ড কাজ (ইমেজ প্রসেসিং, ক্যালকুলেশন), অর্ডার গুরুত্বপূর্ণ নয়

সতর্কতা

  • শেয়ার্ড স্টেট মডিফাই করলে রেস কন্ডিশন হয় — লক বা থ্রেড-সেফ কালেকশন ব্যবহার করুন
  • ওভারহেড থাকলে (খুব ছোট কাজ) Parallel.ForEach দ্রুত হতে পারে না
  • UI থ্রেডে (WinForms/WPF) Parallel.ForEach ব্যবহার করবেন না — ডেডলক হয়
  1. DirectX 11 এবং DirectX 12-এর পার্থক্য কী?

  2. C#-এ লিটারেল (Literal) এবং কনস্ট্যান্ট (Constant) এর পার্থক্য

  3. C#-এ String (ক্লাস) এবং string (এলিয়াস) এর পার্থক্য

  4. C#-এ লিস্ট এবং অ্যারেতে পার্থক্য (List vs Array)