我的服务层正在缓存大量的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; }