Parallel.ForEach och PLINQ
Kör arbete parallellt med Parallel.ForEach och bygg parallella pipelines med PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered).
Parallel.ForEach och PLINQ är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 1 av 3. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 3 lektioner.
Varför parallella loopar
Mål: Utnyttja CPU:n bättre.
- Parallel.ForEach: åtgärd per element
- PLINQ: parallell fråga med operatorer
- Styr graden av parallellism
- Var försiktig med sidoeffekter
Grunderna i Parallel.ForEach
Parallel.ForEach fördelar iterationerna över trådar; varje iteration kör den angivna åtgärden.
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);
});
}
}
Styr parallellism
Använd ParallelOptions.MaxDegreeOfParallelism för att begränsa samtidigheten när resurserna är knappa.
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-pipeline
PLINQ kör LINQ-operatorer parallellt. ForAll förbrukar resultaten samtidigt, utan ordning.
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));
}
}
Ordningstyrning
Använd AsOrdered för att bevara ordningen; AsSequential växlar tillbaka till entrådad LINQ när det behövs.
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äkerhet och tips
Tips:
- Undvik delat föränderligt tillstånd; föredra rena funktioner.
- Använd trådsäkra samlingar om ni måste skriva till dem.
- Använd större batcher i stället för små arbetsobjekt.
- Mät: parallellism hjälper CPU-bundet arbete, inte väntan på I/O.
Parallel.ForEach kontra PLINQ
Sammanfattning
Sammanfattning: Använd Parallel.ForEach för åtgärder per element och PLINQ för att skapa parallella frågor, styra samtidigheten och vid behov bevara ordningen.
Lär dig C# med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 93
- Lektioner
- 346
Vanliga frågor
Är lektionen ”Parallel.ForEach och PLINQ” gratis?
Ja – hela texten till ”Parallel.ForEach och PLINQ” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 3 lektioner.
Vad lär jag mig i ”Parallel.ForEach och PLINQ”?
Kör arbete parallellt med Parallel.ForEach och bygg parallella pipelines med PLINQ (AsParallel, WithDegreeOfParallelism, AsOrdered). Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C# Academy?
Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 3.
Hur lång tid tar lektionen ”Parallel.ForEach och PLINQ”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C# Academy-lektionen?
Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Parallel.ForEach och PLINQ
- Producent/konsument med Channels (översikt)
- Avvägningar mellan throughput och latency