using System.Collections;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Threading.Tasks;
public static readonly ClientDummy _client = new ClientDummy();
public static async Task Main()
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
var args = Enumerable.Range(0, 10).Select(i => $"{i}").ToList();
await Parallel.ForEachAsync( args, new ParallelOptions{ MaxDegreeOfParallelism = 2 }, (a, ct) => DoItAsync(a, results, ct));
public static async ValueTask DoItAsync( string someParam, ConcurrentBag<string> results, CancellationToken ct = default )
results.Add(await _client.Step2Async(await _client.Step1Async(someParam, ct), ct));
public sealed class ClientDummy
public async Task<string> Step1Async( string someParam, CancellationToken ct = default )
await Task.Delay(10, ct);
return someParam + " from step 1";
public async Task<string> Step2Async( string someParam, CancellationToken ct = default )
await Task.Delay(10, ct);
return $"Done: {someParam}";