using System.Threading.Tasks;
using System.Collections.Generic;
using System.Collections.Concurrent;
public static class Program
ThreadPool.GetMinThreads(out int workerThreads, out _);
Console.WriteLine($"WorkerThreads: {workerThreads}, ProcessorCount: {Environment.ProcessorCount}");
ThreadPool.SetMinThreads(10, 10);
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} Starting");
.ParallelForEachAsync_HouseCat(async x =>
await Task.CompletedTask;
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} Processed #{x}");
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} Finished");
public static Task ParallelForEachAsync_HouseCat<T>(this IEnumerable<T> source,
Func<T, Task> funcBody, int maxDoP = 4)
async Task AwaitPartition(IEnumerator<T> partition)
while (partition.MoveNext())
{ await funcBody(partition.Current); }
.Select(p => AwaitPartition(p)));
public static Task ParallelForEachAsync_StephenToub<T>(this IEnumerable<T> source,
Func<T, Task> funcBody, int maxDoP = 4)
Task AwaitPartition(IEnumerator<T> partition)
return Task.Run(async () =>
while (partition.MoveNext())
{ await funcBody(partition.Current); }
.Select(p => AwaitPartition(p)));