using System.Collections.Concurrent;
using System.Threading.Tasks;
private static ConcurrentDictionary<string, Lazy<Task>> tokenValidations =
new ConcurrentDictionary<string, Lazy<Task>>();
public static int index = 0;
static async Task Main(string[] args)
ValidateTokenAsync("AAAAA"),
ValidateTokenAsync("AAAAA"),
ValidateTokenAsync("BBBBB"),
ValidateTokenAsync("CCCCC"),
ValidateTokenAsync("AAAAA"),
ValidateTokenAsync("AAAAA"),
ValidateTokenAsync("EEEEE"),
ValidateTokenAsync("AAAAA"),
ValidateTokenAsync("GGGGG"),
ValidateTokenAsync("HHHHH"),
ValidateTokenAsync("ZZZZZ"),
ValidateTokenAsync("AAAAA"),
ValidateTokenAsync("AAAAA")
await Task.WhenAll(tasks);
Console.Write($"\nFin with index: {index}");
public static async Task ValidateTokenAsync(string token)
var validationTask = tokenValidations.GetOrAdd(token, _ => new Lazy<Task>(() => RefreshToken(token), LazyThreadSafetyMode.ExecutionAndPublication));
await validationTask.Value;
private static async Task RefreshToken(string token)
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} is refreshing token: {token} \n");