C# · 12月 30, 2021

c# – 异步/等待和缓存

我的服务层正在缓存大量的Db请求到memcached,这是不是可以使用Async / Await?例如我如何等待这个? public virtual Store GetStoreByUsername(string username){ return _cacheManager.Get(string.Format(“Cache_Key_{0}”,username),() => { return _storeRepository.GetSingle(x => x.UserName == username); });}

注意:如果密钥存在于缓存中,它将返回“存储”(而不是任务< Store>),如果该高速缓存中不存在该键,则它将执行该lambda.如果我将Func更改为

return await _storeRepository.GetSingleAsync(x => x.UserName == username);

和方法签名

public virtual async Task<Store> GetStoreByUsername(string username)

由于缓存返回类型,这将无法正常工作.

解决方法 它看起来像缓存管理器做所有的“检查它存在,如果不运行lambda然后存储”.如果是这样,使异步操作的唯一方法是具有一个GetAsync方法,该方法返回一个Task< Store>而不是商店,即 public virtual Task<Store> GetStoreByUsernameAsync(string username){ return _cacheManager.GetAsync(string.Format(“Cache_Key_{0}”,() => { return _storeRepository.GetSingleAsync(x => x.UserName == username); });}

请注意,这不需要标记为异步,因为我们没有使用等待.然后,缓存管理器将执行以下操作:

public async Task<Store> GetAsync(string key,Func<Task<Store>> func){ var val = cache.Get(key); if(val == null) { val = await func().ConfigureAwait(false); cache.Set(key,val); } return val;}