using System.Threading.Tasks;
public static async Task Main()
Console.WriteLine($"Thread # {Thread.CurrentThread.ManagedThreadId} is running the program.");
await Task.WhenAll(Enumerable.Range(0, 10).Select(async _ => {
var result = await dal.GetValue();
var result = await dal.GetValue();
Console.WriteLine($"Current value is {result}");
private static object _lock = new object();
private static DateTime _refreshTime = DateTime.MinValue;
private static bool isBeingRefreshed = false;
private static int currentValue = 0;
public async Task<int> GetValue()
bool isCurrentThreadRefreshing = false;
if (!isBeingRefreshed && _refreshTime < DateTime.Now.AddSeconds(-5)) {
isCurrentThreadRefreshing = true;
if (isCurrentThreadRefreshing) {
isBeingRefreshed = false;
_refreshTime = DateTime.Now;
Console.WriteLine($"Thread # {Thread.CurrentThread.ManagedThreadId} refreshed the value.");