using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Threading.Tasks;
public static void Main()
const int degreeOfParallelism = 2;
CancellationToken token = new CancellationTokenSource(3000).Token;
ThreadPool.SetMinThreads(degreeOfParallelism, Environment.ProcessorCount);
Partitioner.Create(Iterator(token), EnumerablePartitionerOptions.NoBuffering)
.WithDegreeOfParallelism(degreeOfParallelism)
.ForAll(item => ProcessItemAsync(item).GetAwaiter().GetResult());
catch (OperationCanceledException) { }
private static IEnumerable<Item> Iterator(CancellationToken token)
Task delayTask = Task.Delay(500, token);
Print($"Iterator before GetDatabaseItems");
foreach (Item item in GetDatabaseItems())
delayTask.GetAwaiter().GetResult();
private static int _idSeed = 0;
private class Item { public int Id { get; } = Interlocked.Increment(ref _idSeed); }
private static Item[] GetDatabaseItems() => new Item[] {new(), new(), new()};
private static async Task ProcessItemAsync(Item item)
Print($"Processing item #{item.Id}");
private static void Print(object value)
Console.WriteLine($@"{DateTime.Now:HH:mm:ss.fff} [{Thread.CurrentThread
.ManagedThreadId}] > {value}");