Izvan async/ za I/O, .NET pruža za — pokretanje izračuna kroz više jezgri. Ključna razlika: / je za I/O konkurenciju (ne-blokirajuća čekanja), dok su , i PLINQ za paraleliziranje CPU-intenzivnog rada.
Izvan async/ za I/O, .NET pruža za — pokretanje izračuna kroz više jezgri. Ključna razlika: / je za I/O konkurenciju (ne-blokirajuća čekanja), dok su , i PLINQ za paraleliziranje CPU-intenzivnog rada.
awaitasyncawaitTask.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 raspoređuje rad na thread pool thread — koristite ga za paraleliziranje CPU-bound izračuna (NE za I/O, gdje async/await već zadovoljava bez dodatnih threadova).
// 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 i PLINQ (.AsParallel()) automatski distribuiraju rad kroz jezgre — odličan za CPU-teško procesiranje nezavisnih stavki. (Vrijedi samo za stvarno CPU-bound, značajniji rad — postoji 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
Razumijevanje Tasks i paralelizma izvan async/await važno je znanje na razini seniora za izgradnju performantnih C# aplikacija, a ključna razlika između I/O konkurencije i CPU paralelizma je ključna spoznaja — česta točka zbunjenosti. async/await upravlja I/O-bound konkurencijom (oslobađanjem threadova tijekom čekanja) ali ne dodaje CPU paralelizam, dok CPU-bound rad (izračuni, procesiranje podataka) koristi od stvarnog paralelizma kroz jezgre putem Task.Run (prebacivanja CPU rada na thread pool threadove), Parallel.For/ForEach i PLINQ (.AsParallel()).
Znanje koje se sredstvo uklapa — async/await za I/O, TPL paralelizma za CPU-bound rad — je važno za efektivnu optimizaciju performansi, jer korištenje krivo (npr. očekivanje da async ubrzava izračune, ili pokretanje threadova za I/O koji async učinkovito upravlja) je neučinkovito.
Jednako važno je razumijevanje thread safety: paralelni kod koji pristupa zajedničkom stanju trebate sinkronizaciju (lock, Interlocked za atomske operacije, ili thread-safe kolekcije poput ConcurrentDictionary) kako bi izbjegli race conditions — kritična briga za ispravnost u paralelnom kodu.
Razumijevanje I/O-vs-CPU razlike, paralelizma sredstava (Task.Run, Parallel, PLINQ) i thread-safety zahtjeva vrijedno je za pisanje ispravnog, performantnog konkurentnog i paralelnog C#.
Budući da moderne aplikacije često trebaju i I/O konkurenciju i CPU paralelizam, te budući da odabiranje pristupa i pravilno rukovanje thread safety su ono što čini paralelni kod učinkovitim i ispravnim, ovo je važno, često relevantno znanje na razini seniora za performance-osjetljiv C# razvoj.