From wpf-dev-pack
Provides .NET patterns for parallel processing CPU-bound tasks using Parallel.For, PLINQ, and ConcurrentCollections to leverage multi-core processors.
How this skill is triggered — by the user, by Claude, or both
Slash command
/wpf-dev-pack:processing-parallel-taskssonnetThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A guide for APIs and patterns for parallel processing of CPU-bound tasks.
A guide for APIs and patterns for parallel processing of CPU-bound tasks.
Quick Reference: See QUICKREF.md for essential patterns at a glance.
| API | Purpose |
|---|---|
Parallel.For, Parallel.ForEach | CPU-bound parallel processing |
PLINQ (.AsParallel()) | LINQ query parallelization |
Partitioner<T> | Large data partitioning |
ConcurrentDictionary<K,V> | Thread-safe dictionary |
public sealed class ImageProcessor
{
public void ProcessImages(IEnumerable<string> imagePaths)
{
var options = new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount
};
Parallel.ForEach(imagePaths, options, path =>
{
ProcessImage(path);
});
}
}
Parallel.For(0, data.Length, (i, state) =>
{
if (data[i] == target)
{
state.Break();
}
});
var results = data
.AsParallel()
.WithDegreeOfParallelism(Environment.ProcessorCount)
.Where(d => d.IsValid)
.Select(d => Transform(d))
.ToList();
// When order preservation is needed
var results = data
.AsParallel()
.AsOrdered()
.Select(d => Process(d))
.ToList();
| Collection | Purpose |
|---|---|
ConcurrentDictionary<K,V> | Thread-safe dictionary |
ConcurrentQueue<T> | Thread-safe FIFO queue |
ConcurrentBag<T> | Thread-safe unordered collection |
// Collecting results during parallel processing
var results = new ConcurrentBag<Result>();
Parallel.ForEach(data, item =>
{
var result = Process(item);
results.Add(result);
});
Prevents contention with thread-local variables
private readonly ThreadLocal<StringBuilder> _localBuilder =
new(() => new StringBuilder());
public void ProcessInParallel()
{
Parallel.For(0, 1000, i =>
{
var sb = _localBuilder.Value!;
sb.Clear();
sb.Append(i);
});
}
// ❌ Using Parallel for I/O operations
Parallel.ForEach(urls, url => httpClient.GetAsync(url).Result);
// ✅ Using async-await for I/O operations
await Task.WhenAll(urls.Select(url => httpClient.GetAsync(url)));
// ❌ Parallel writes to regular collection
var list = new List<int>();
Parallel.For(0, 1000, i => list.Add(i)); // Race condition!
// ✅ Using thread-safe collection
var bag = new ConcurrentBag<int>();
Parallel.For(0, 1000, i => bag.Add(i));
npx claudepluginhub christian289/dotnet-with-claudecode --plugin wpf-dev-packProvides .NET async patterns using Task, ValueTask, ConfigureAwait, IAsyncEnumerable for non-blocking I/O, streams, cancellation, concurrency control, and anti-patterns.
Guides C# async/await patterns including Task, ValueTask, async streams, and cancellation for responsive applications. Use when writing asynchronous C# code.
Writing async/await code. Task patterns, ConfigureAwait, cancellation, and common agent pitfalls.