Parallel.ForEach ja PLINQ
Suorittakaa työtä rinnakkain Parallel.ForEach-menetelmällä ja rakentakaa rinnakkaisia putkia PLINQ:lla (AsParallel, WithDegreeOfParallelism, AsOrdered).
Parallel.ForEach ja PLINQ on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/3. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 3 oppituntia.
Miksi rinnakkaissilmukat
Tavoite: Hyödynnä suoritinta paremmin.
- Parallel.ForEach: toiminto jokaista alkiota kohti
- PLINQ: rinnakkainen kysely operaattoreineen
- Rajoita rinnakkaisuuden astetta
- Varo sivuvaikutuksia
Parallel.ForEach-perusteet
Parallel.ForEach jakaa iteraatiot säikeille; kukin alkio käsitellään annetulla toiminnolla.
using System;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
// Runs iterations concurrently on thread pool
Parallel.ForEach(data, x =>
{
int y = x * x; // small CPU work
Console.WriteLine("x=" + x + " y=" + y + " on " + Environment.CurrentManagedThreadId);
});
}
}
Rinnakkaisuuden hallinta
Käytä ominaisuutta ParallelOptions.MaxDegreeOfParallelism samanaikaisuuden rajoittamiseen, kun resursseja on niukasti.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
ParallelOptions opt = new ParallelOptions();
opt.MaxDegreeOfParallelism = 2; // limit concurrency
Parallel.ForEach(data, opt, x =>
{
Console.WriteLine("Start " + x);
Thread.Sleep(150); // simulate work
Console.WriteLine("Done " + x);
});
}
}
PLINQ-putki
PLINQ suorittaa LINQ-operaattorit rinnakkain. ForAll käsittelee tulokset samanaikaisesti (järjestämättöminä).
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] nums = Enumerable.Range(1, 20).ToArray();
// Filter then project in parallel
var query =
nums
.AsParallel()
.WithDegreeOfParallelism(2)
.Where(n => n % 2 == 0)
.Select(n => n * n);
// ForAll consumes in parallel; order not guaranteed
query.ForAll(sq => Console.WriteLine(sq));
}
}
Järjestyksen hallinta
Käytä AsOrdered-toimintoa järjestyksen säilyttämiseen; AsSequential vaihtaa tarvittaessa takaisin yksisäikeiseen LINQ-käsittelyyn.
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] nums = new int[] { 5, 4, 3, 2, 1 };
// Preserve original sequence order for the output
var ordered =
nums.AsParallel().AsOrdered().Select(n => n * 10).ToArray();
// Switch back to sequential for a section if needed
var seq =
nums.AsParallel().Select(n => n + 1).AsSequential().Where(n => n > 3).ToArray();
Console.WriteLine("Ordered: " + string.Join(",", ordered));
Console.WriteLine("Sequential tail: " + string.Join(",", seq));
}
}
Turvallisuus ja vinkit
Vinkit:
- Vältä jaettua muuntuvaa tilaa; suosi puhtaita funktioita.
- Käytä säieturvallisia kokoelmia, jos sinun on kirjoitettava jaettuun kokoelmaan.
- Käsittele suurempia eriä pienten työalkioiden sijaan.
- Mittaa suorituskykyä: rinnakkaisuus auttaa suoritinsidonnaisessa työssä, mutta ei I/O-odotuksessa.
Parallel.ForEach ja PLINQ
Kertaus
Kertaus: Käytä Parallel.ForEach-toimintoa alkioiden käsittelyyn; käytä PLINQ-toimintoa rinnakkaisten kyselyjen rakentamiseen, samanaikaisuuden hallintaan ja tarvittaessa järjestyksen säilyttämiseen.
Opi C# tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 93
- Oppitunnit
- 346
Usein kysytyt kysymykset
Onko oppitunti ”Parallel.ForEach ja PLINQ” ilmainen?
Kyllä – oppitunnin ”Parallel.ForEach ja PLINQ” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 3 oppituntia.
Mitä opin oppitunnilla ”Parallel.ForEach ja PLINQ”?
Suorittakaa työtä rinnakkain Parallel.ForEach-menetelmällä ja rakentakaa rinnakkaisia putkia PLINQ:lla (AsParallel, WithDegreeOfParallelism, AsOrdered). Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/3.
Kuinka kauan ”Parallel.ForEach ja PLINQ”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?
Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Parallel.ForEach ja PLINQ
- Tuottaja–kuluttaja Channels-mallilla (yleiskatsaus)
- Suoritusmäärän ja viiveen kompromissit