У меня есть простой синглтон-класс,
public class SimpleSingleton
{
public async Task<int> GetRefreshedValue()
{
/*
What goes here?
*/
return await GetRefreshedValueImplementation();
/*
What goes here?
*/
}
private async Task<int> GetRefreshedValueImplementation()
{
/*
Resource intensive and not thread safe
*/
}
}
Поскольку это синглтон, GetRefreshedValue
будет вызываться одновременно. Я хочу, чтобы одновременно выполнялось ровно одна или ноль задач GetRefreshedValueImplementation
.
Само по себе это было бы просто, я мог бы использовать SemaphoreSlim
.
private static SemaphoreSlim gate = new SemaphoreSlim(1);
...
await gate.WaitAsync();
try
{
return await GetRefreshedValueImplementation();
}
finally
{
gate.Release();
}
Однако я хочу, чтобы каждая задача, ожидающая у ворот, получила недавно вычисленное возвращаемое значение. Я не хочу, чтобы они стояли в очереди, чтобы сделать звонок.
Как лучше написать этот код?