Nested ForEachAsync

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
					
public class Program
{
	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) {
		// some time consuming calculation ...		
		var key = i%3;
		const int listSize = 10;
		IReadOnlyList<int> list;
		await semaphore.WaitAsync();
		try {
			if(!resource.TryGetValue(key, out list)) {
				var newList = new int[listSize];
				list = newList;
				resource.Add(key, list);
		        await Parallel.ForEachAsync(Enumerable.Range(0,listSize), InnerLoopFunction);
				ValueTask InnerLoopFunction(int j, CancellationToken cancel) {
					// some time consuming calculation ...
					newList[j] = 42+i;
					return ValueTask.CompletedTask;
				}
			}
		} finally {
			semaphore.Release();
		}			
		// do something with list
	}	
}
;