I/O এর জন্য / এর বাইরে, .NET প্রদান করে এর জন্য — একাধিক কোর জুড়ে computations চালানো। মূল পার্থক্য: / হল I/O concurrency এর জন্য (non-blocking waits), যখন , , এবং PLINQ CPU-intensive কাজকে parallelize করার জন্য।
I/O এর জন্য / এর বাইরে, .NET প্রদান করে এর জন্য — একাধিক কোর জুড়ে computations চালানো। মূল পার্থক্য: / হল I/O concurrency এর জন্য (non-blocking waits), যখন , , এবং PLINQ CPU-intensive কাজকে parallelize করার জন্য।
asyncawaitasyncawaitTask.RunParallelasync/await → I/O-bound concurrency. Frees the thread during waits (DB, network).
Does NOT add CPU parallelism.
Parallelism → CPU-bound work spread across MULTIPLE CORES (computation, processing).
Use Task.Run, Parallel.For/ForEach, PLINQ.
// run a CPU-intensive computation on a thread pool thread (don't block the caller)
int result = await Task.Run(() => ExpensiveComputation());
// run multiple in parallel and combine
var tasks = items.Select(item => Task.Run(() => Process(item)));
var results = await Task.WhenAll(tasks); // wait for all
Task.Run thread pool thread এ কাজ schedule করে — এটি CPU-bound computation কে parallelize করতে ব্যবহার করুন (I/O এর জন্য নয়, যেখানে async/await ইতিমধ্যে অতিরিক্ত threads ছাড়াই যথেষ্ট)।
// Parallel.For/ForEach — process a collection across cores
Parallel.ForEach(items, item => Process(item)); // automatically uses multiple cores
Parallel.For(0, 1000, i => Compute(i));
// PLINQ — parallel LINQ
var results = data.AsParallel().Where(x => IsValid(x)).Select(Transform).ToList();
Parallel.For/ForEach এবং PLINQ (.AsParallel()) স্বয়ংক্রিয়ভাবে কোর জুড়ে কাজ বিতরণ করে — CPU-heavy processing এর জন্য স্বাধীন items এর জন্য দুর্দান্ত। (শুধুমাত্র সত্যিকারের CPU-bound, বড় আকারের কাজের জন্য মূল্যবান — overhead আছে।)
// parallel code accessing SHARED state needs synchronization or thread-safe types
lock (_lock) { _counter++; } // lock for mutual exclusion
Interlocked.Increment(ref _counter); // lock-free atomic
var dict = new ConcurrentDictionary<string, int>(); // thread-safe collection
Async/await এর বাইরে Task এবং parallelism বোঝা senior-level জ্ঞান যা পারফরম্যান্ট C# অ্যাপ্লিকেশন তৈরির জন্য গুরুত্বপূর্ণ, এবং I/O concurrency এবং CPU parallelism এর মধ্যে গুরুত্বপূর্ণ পার্থক্য হল মূল অন্তর্দৃষ্টি — একটি সাধারণ বিভ্রান্তির বিন্দু। async/await I/O-bound concurrency পরিচালনা করে (waits এর সময় threads মুক্ত করে) কিন্তু CPU parallelism যোগ করে না, যখন CPU-bound কাজ (computations, data processing) Task.Run (CPU কাজকে thread pool threads এ offload করা), Parallel.For/ForEach, এবং PLINQ (.AsParallel()) এর মাধ্যমে কোর জুড়ে আসল parallelism থেকে উপকৃত হয়।
কোন tool কোথায় ফিট করে তা জানা — I/O এর জন্য async/await, CPU-bound কাজের জন্য TPL parallelism tools — কার্যকর পারফরম্যান্স অপটিমাইজেশনের জন্য অপরিহার্য, কারণ ভুল tool ব্যবহার করা (যেমন async দিয়ে computation speed আশা করা, বা I/O এর জন্য threads spin up করা যা async দক্ষতার সাথে পরিচালনা করে) অকার্যকর।
সমান গুরুত্বপূর্ণ হল thread safety বোঝা: shared state access করা parallel code কে synchronization (lock, Interlocked atomic operations এর জন্য, বা ConcurrentDictionary এর মতো thread-safe collections) দরকার race conditions এড়াতে — parallel code এ একটি গুরুত্বপূর্ণ correctness উদ্বেগ।
I/O-vs-CPU পার্থক্য, parallelism tools (Task.Run, Parallel, PLINQ), এবং thread-safety requirements বোঝা সঠিক, পারফরম্যান্ট concurrent এবং parallel C# লেখার জন্য মূল্যবান।
আধুনিক অ্যাপ্লিকেশনগুলির প্রায়ই I/O concurrency এবং CPU parallelism উভয়ের প্রয়োজন হয়, এবং সঠিক approach বেছে নেওয়া এবং thread safety সঠিকভাবে পরিচালনা করা সেই কারণগুলি যা parallel code কে কার্যকর এবং সঠিক করে তোলে, এটি performance-sensitive C# development এর জন্য গুরুত্বপূর্ণ, ঘন ঘন প্রাসঙ্গিক senior জ্ঞান।