【发布时间】:2019-04-04 14:41:45
【问题描述】:
我有一个简单的单例类,
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();
}
但是,我希望在门口等待的每个任务都能获得最近计算的返回值。我不希望他们排队打电话。
编写该代码的最佳方式是什么?
【问题讨论】:
-
"最近计算的返回值" 什么意思?您只想计算一次,或者您有重新计算的规则?
-
@Bombinosh 我希望在内部任务启动后调用的所有调用者与原始调用者一起等待内部任务的结果。
-
您是否考虑过使用System.Lazy<T> 存储计算值这样简单的方法?
-
@JohnWu 然后它将被永远重复使用,而不是直到操作完成。
-
@JohnWu 是的和
AsyncLazy<T>但是,我怎么会有一个只持续方法调用的懒惰。
标签: c# multithreading async-await