using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
private static ConcurrentDictionary<string, Lazy<Task<DateTime>>> _cache = new();
public static async Task Main()
Console.WriteLine("Hello World");
Console.WriteLine("----------------------------------------");
public static async Task DoWork()
List<Task<DateTime>> tasks = new();
var start = DateTime.UtcNow;
Console.WriteLine("The Start: " + start + " / " + start.Ticks);
for(var i = 0; i < 10; i++)
tasks.Add(GetDateFromCache());
await Task.WhenAll(tasks);
foreach(var task in tasks)
Console.WriteLine(task.Result + " / " + task.Result.Ticks);
var end = DateTime.UtcNow;
Console.WriteLine("The End: " + end + " / " + end.Ticks);
public static async Task<DateTime> GetDateFromCache()
var result = await _cache.GetOrAdd("someDateTime", new Lazy<Task<DateTime>>(async () =>
var someData = await GetDataFromSomeExternalDependency();
public static async Task<int> GetDataFromSomeExternalDependency()