using System.Collections.Generic;
using System.Threading.Tasks;
public static async Task Main()
var service = new TokenService();
Console.WriteLine(service.GetToken().AccessToken);
var requests = new List<Task>(10);
for (int i = 0; i < 10; i++)
requests.Add(Task.Run(async() =>
await Task.Delay(Random.Shared.Next() % 1000);
await service.RefreshToken();
Console.WriteLine(service.GetToken().AccessToken);
await Task.WhenAll(requests);
public class TokenService : ITokenService
private readonly SemaphoreSlim semaphore = new(1);
private DateTime lastRefreshed = DateTime.UtcNow;
=> new() { Scheme = "Bearer", AccessToken = lastRefreshed.ToString("HH:mm:ss")};
public async Task RefreshToken()
await semaphore.WaitAsync();
if((lastRefreshed - DateTime.UtcNow).Duration() < TimeSpan.FromSeconds(1).Duration())
Console.WriteLine("No refreshment happened");
Console.WriteLine("Refreshment happened");
lastRefreshed = DateTime.UtcNow;
public record struct Token(string Scheme, string AccessToken);
public interface ITokenService