using System.Threading.Tasks;
using Microsoft.VisualStudio.Threading;
using System.Collections.Concurrent;
static ConcurrentDictionary<string, AsyncLazy<int>> dict = new ConcurrentDictionary<string, AsyncLazy<int>>();
static void Main(string[] args)
var tasks = new Task<int>[1000];
for (var i=1; i<=1000; i++)
tasks[i-1] = Task.Run(async () => await GetValue(r.ToString()));
var maxValue = tasks.Select(t => t.Result).Max();
Console.WriteLine("MaxValue:"+maxValue.ToString());
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);