CSharp · Console
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
}
}