在 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(),这是非常昂贵的。
使用 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;
}