我有一个可以同时从许多UI元素调用的函数:
在Psudeo代码中
public async Task<Customer> GetCustomer(){
if(IsInCache)
return FromCache;
cache = await GetFromWebService();
return cache;
}
如果10个UI元素同时全部调用,我如何确保只调用 GetFromWebService ()一次,这非常昂贵。
答案 0 :(得分:12)
使用Lazy
。
//the lazy can be changed to an instance variable, if that's appropriate in context.
private static Lazy<Task<Customer>> lazy =
new Lazy<Task<Customer>>(() => GetFromWebService());
public Task<Customer> GetCustomer(){
return lazy.Value;
}
这将确保创建完全一个 Task
,并且在至少发出一个请求之前不会进行Web服务调用。然后,任何将来的请求都将返回相同的Task
(无论是正在进行还是完成),等待获取该值。
答案 1 :(得分:1)
如果缓存是内存中的,则可以缓存任务而不是结果:
private Task<Customer> _cache;
public Task<Customer> GetCustomerAsync()
{
if (_cache != null)
return _cache;
_cache = GetFromWebServiceAsync();
return _cache;
}