I/O को लागि / भन्दा बाहिर, .NET ले को लागि प्रदान गर्छ — multiple cores मा computation चलाउने। मुख्य भिन्नता: / I/O concurrency (non-blocking waits) को लागि हो, जबकि , , र PLINQ CPU-intensive work लाई parallelize गर्न को लागि हो।
I/O को लागि / भन्दा बाहिर, .NET ले को लागि प्रदान गर्छ — multiple cores मा computation चलाउने। मुख्य भिन्नता: / I/O concurrency (non-blocking waits) को लागि हो, जबकि , , र PLINQ CPU-intensive work लाई 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 पहिलेदेखी extra 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()) ले cores मा काम स्वचालित रूपमा वितरण गर्छ — 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
Tasks र parallelism लाई async/await भन्दा बाहिर बुझ्नु भनेको performant C# applications बनाउन को लागि महत्वपूर्ण senior-level ज्ञान हो, र I/O concurrency र CPU parallelism बीचको गुरुत्वपूर्ण भिन्नता भनेको मुख्य अन्तर्दृष्टि हो — सामान्य भ्रमको बिन्दु। async/await ले I/O-bound concurrency (waits को समय threads मुक्त गर्छ) को ब्यवस्थापन गर्छ तर CPU parallelism जोडदैन, जबकि CPU-bound काम (computations, data processing) cores को फेरि parallelism बाट लाभान्वित हुन्छ Task.Run (CPU काम लाई thread pool threads मा offload गरेर), Parallel.For/ForEach, र PLINQ (.AsParallel()) को माध्यमबाट।
कुन tool फिट हुन्छ भन्ने कुरा जान्नु — I/O को लागि async/await, CPU-bound काम को लागि TPL parallelism tools — प्रभावकारी performance optimization को लागि आवश्यक छ, किनकि गलत एक प्रयोग गर्नु (उदाहरणको लागि computation लाई गति दिन async को अपेक्षा गर्नु, वा async ले efficiently ब्यवस्थापना गर्ने I/O को लागि threads खोल्नु) अप्रभावकारी छ।
Thread safety भनेको पनि समान रूपमा महत्वपूर्ण छ: shared state को पहुँच गर्ने parallel code लाई synchronization (lock, Interlocked atomic operations को लागि, वा thread-safe collections जस्तै ConcurrentDictionary) चाहिन्छ race conditions बाट बच्न — parallel code मा गुरुत्वपूर्ण correctness चिन्ता।
I/O-vs-CPU भिन्नता, parallelism tools (Task.Run, Parallel, PLINQ), र thread-safety requirements लाई बुझ्नु सही, performant concurrent र parallel C# लेख्न को लागि मूल्यवान छ।
आधुनिक applications सामान्यतः I/O concurrency र CPU parallelism दुवै चाहिन्छ, र सही approach छान्नु र thread safety सही ढङ्गले ब्यवस्थापना गर्नु भनेको जो parallel code लाई प्रभावकारी र सही बनाउँछ, यो performance-sensitive C# development को लागि महत्वपूर्ण, बारम्बार-प्रासङ्गिक senior ज्ञान हो।