在C#中使用缓存多次调用异步函数

时间:2014-11-26 21:23:41

标签: c# asynchronous task-parallel-library async-await

我有一个可以同时从许多UI元素调用的函数:

在Psudeo代码中

public async Task<Customer> GetCustomer(){
   if(IsInCache)
      return FromCache;

   cache = await GetFromWebService();
   return cache;

}

如果10个UI元素同时全部调用,我如何确保只调用 GetFromWebService ()一次,这非常昂贵。

2 个答案:

答案 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;
}