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
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
- Parallel.ForEach et PLINQ
- Producteur/consommateur avec Channels (vue d’ensemble)
- Compromis entre débit et latence