Beyond async/ za I/O, .NET zagotavlja za — izvajanje izračunov na več jedrih. Ključna razlika: / je za I/O sočasnost (neblokiranje čakanja), medtem ko sta , in PLINQ za paralelizacijo CPU-intenzivnega dela.
Beyond async/ za I/O, .NET zagotavlja za — izvajanje izračunov na več jedrih. Ključna razlika: / je za I/O sočasnost (neblokiranje čakanja), medtem ko sta , in PLINQ za paralelizacijo CPU-intenzivnega dela.
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 razporedi delo na niti iz bazena niti — uporabi ga za paralelizacijo CPU-bound izračunov (NE za I/O, kjer async/await že zadostuje brez dodatnih niti).
// 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 in PLINQ (.AsParallel()) avtomatično razdelita delo po jedrih — odličko za CPU-težko obdelavo neodvisnih postavk. (Vredno le za resnično CPU-bound, večje delo — obstaja režija.)
// 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
Razumevanje Tasks in paralelizma Beyond async/await je pomembno znanje višjega nivoja za gradnjo učinkovitih C# aplikacij, odločilna razlika med I/O sočasnostjo in CPU paralelizmom pa je ključni vpogled — pogosto mesto zmede. async/await obravnava I/O-bound sočasnost (osvobajanje niti med čakanjem), vendar ne dodaja CPU paralelizma, medtem ko CPU-bound delo (izračuni, obdelava podatkov) koristi od pravi paralelizem čez jedra prek Task.Run (prenos CPU dela na niti bazena), Parallel.For/ForEach in PLINQ (.AsParallel()).
Znanje, katero orodje se ujema — async/await za I/O, TPL paralelne orodja za CPU-bound delo — je bistveno za učinkovito optimizacijo delovanja, ker je uporaba napačnega (npr. pričakovanje, da async pospeši izračun, ali nastavljanje niti za I/O, ki ga async učinkovito obravnava) neučinkovita.
Enako pomembno je razumevanje varnosti niti: paralelna koda, ki dostopa do skupnega stanja, potrebuje sinhronizacijo (lock, Interlocked za atomske operacije ali varnih za niti zbirk, kot je ConcurrentDictionary), da se izognete podnebojem — kritičen problem pravilnosti v paralelni kodi.
Razumevanje razlike I/O-vs-CPU, paralelnih orodij (Task.Run, Parallel, PLINQ) in zahtev varnosti niti je dragoceno za pisanje pravilne, učinkovite sočasne in paralelne C#.
Ker sodobne aplikacije pogosto potrebujejo tako I/O sočasnost kot CPU paralelizem, in ker je izbira pravega pristopa in pravilno obravnavanje varnosti niti tisto, kar učinkovit in pravilno paralelno kodo naredi, je to pomembno, pogosto relevantno znanje višje ravni za performančno občutljiv C# razvoj.