C# Academy · Oppitunti

Parallel.ForEach ja PLINQ

Suorittakaa työtä rinnakkain Parallel.ForEach-menetelmällä ja rakentakaa rinnakkaisia putkia PLINQ:lla (AsParallel, WithDegreeOfParallelism, AsOrdered).

Oppitunti 1/38 vaihetta

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

Pikakysymys: Mikä on keskeinen ero Parallel.ForEachin ja PLINQ:n välillä?

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.

Aloita maksutta

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

  1. Parallel.ForEach ja PLINQ
  2. Tuottaja–kuluttaja Channels-mallilla (yleiskatsaus)
  3. Suoritusmäärän ja viiveen kompromissit
← Takaisin: C# Academy