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

本文关键字:函数 调用 异步 缓存 | 更新日期: 2023-09-27 18:32:13

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

在普苏多代码中

public async Task<Customer> GetCustomer(){
   if(IsInCache)
      return FromCache;
   cache = await GetFromWebService();
   return cache;
}

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

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

使用 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(无论是正在进行还是已完成),可以等待该以获取值。

如果您的缓存在内存中,则可以缓存任务而不是结果:

private Task<Customer> _cache;
public Task<Customer> GetCustomerAsync()
{
  if (_cache != null)
    return _cache;
  _cache = GetFromWebServiceAsync();
  return _cache;
}