using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
using System.Collections.Generic;
public static async Task Main()
var (input, completion, output) = CreatePipeline();
IEnumerable<int> data = Enumerable.Repeat(1, 50);
await input.SendAsync(d);
static (ITargetBlock<int>, Task, List<string>) CreatePipeline()
var callBlock = new TransformBlock<int, string>(
new ExecutionDataflowBlockOptions()
MaxDegreeOfParallelism = 5
var outputData = new List<string>();
var aggregateBlock = new ActionBlock<string>(
data => outputData.Add(data),
new ExecutionDataflowBlockOptions()
MaxDegreeOfParallelism = 1
new DataflowLinkOptions()
PropagateCompletion = true
return (callBlock, aggregateBlock.Completion, outputData);
static Task<string> CallApi(int value) => Task.FromResult(value.ToString());