0Pricing
C# Academy · Leçon

Parallel.ForEach et PLINQ

Exécutez le travail en parallèle avec Parallel.ForEach et construisez des pipelines parallèles avec PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered).

Parallel.ForEach et PLINQ est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 3. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 3 leçons au total.

Pourquoi utiliser des boucles parallèles

Objectif : mieux utiliser le CPU.

  • Parallel.ForEach : une action par élément
  • PLINQ : une requête parallèle avec des opérateurs
  • Contrôler le degré de parallélisme
  • Faire attention aux effets secondaires

Principes de Parallel.ForEach

Parallel.ForEach répartit les itérations entre les threads ; chaque élément exécute l’action fournie.

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);
    });
  }
}

Contrôler le parallélisme

Utilisez ParallelOptions.MaxDegreeOfParallelism pour limiter la concurrence lorsque les ressources sont rares.

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);
    });
  }
}

Chaîne de traitement PLINQ

PLINQ exécute les opérateurs LINQ en parallèle. ForAll consomme les résultats simultanément, sans respecter leur ordre.

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));
  }
}

Contrôles de l’ordre

Utilisez AsOrdered pour préserver l’ordre ; AsSequential repasse à LINQ sur un seul thread lorsque cela est nécessaire.

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));
  }
}

Sécurité et conseils

Conseils :

  • Évitez l’état mutable partagé ; préférez les fonctions pures.
  • Utilisez des collections sûres pour les threads si vous devez écrire.
  • Effectuez des lots plus importants plutôt que de traiter de très petits éléments.
  • Mesurez : le parallélisme aide les travaux limités par le CPU, mais pas l’attente d’entrées-sorties.

Parallel.ForEach ou PLINQ

Vérification rapide : quelle est une différence essentielle entre Parallel.ForEach et PLINQ ?

Récapitulatif

Récapitulatif : utilisez Parallel.ForEach pour les actions par élément ; utilisez PLINQ pour créer des requêtes parallèles, contrôler la concurrence et éventuellement préserver l’ordre.

Questions Fréquemment Posées

La leçon « Parallel.ForEach et PLINQ » est-elle gratuite ?

Oui — le texte complet de « Parallel.ForEach et PLINQ » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 3 leçons au total.

Qu'est-ce que j'apprendrai dans « Parallel.ForEach et PLINQ » ?

Exécutez le travail en parallèle avec Parallel.ForEach et construisez des pipelines parallèles avec PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered). Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C# Academy ?

Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 3.

Combien de temps prend la leçon « Parallel.ForEach et PLINQ » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?

Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Parallel.ForEach et PLINQ
  2. Producteur/consommateur avec Channels (vue d’ensemble)
  3. Compromis entre débit et latence
← Retour à C# Academy