using System.Collections.Generic;
using System.Threading.Tasks;
private static Dictionary<int,IReadOnlyList<int>> resource = new();
private static SemaphoreSlim semaphore = new(1);
public static async Task Main()
var outerLoopSource = Enumerable.Range(0,10);
await Parallel.ForEachAsync(outerLoopSource, OuterLoopFunction);
foreach(var (key, list) in resource)
Console.WriteLine(key+": "+string.Join(',', list));
public static async ValueTask OuterLoopFunction(int i, CancellationToken cancel) {
await semaphore.WaitAsync();
if(!resource.TryGetValue(key, out list)) {
var newList = new int[listSize];
await Parallel.ForEachAsync(Enumerable.Range(0,listSize), InnerLoopFunction);
ValueTask InnerLoopFunction(int j, CancellationToken cancel) {
return ValueTask.CompletedTask;