using System.Threading.Tasks;
using Microsoft.VisualStudio.Threading;
using System.Collections.Concurrent;
const int MaxTasks = 100000;
const int MaxSubscription = 50;
static ConcurrentDictionary<string, AsyncLazy<int>> dict = new ConcurrentDictionary<string, AsyncLazy<int>>();
static void Main(string[] args)
var tasks = new Task<int>[MaxTasks];
for (var i=1; i<=MaxTasks; i++)
tasks[i-1] = Task.Run(async () => await GetValue((r % MaxSubscription).ToString()));
var maxValue = tasks.Select(t => t.Result).Max();
Console.WriteLine("MaxValue = " + maxValue);
static async Task<int> GetValue(string val)
var res = dict.GetOrAdd(val, new AsyncLazy<int>(
var res = Interlocked.Increment(ref counter);
var resVal = await res.GetValueAsync().ConfigureAwait(false);