মূল পার্থক্য
| বিষয় | foreach | Parallel.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 ব্যবহার করবেন না — ডেডলক হয়