加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 异步/等待和缓存

发布时间:2020-12-15 06:55:28 所属栏目:百科 来源:网络整理
导读:我的服务层正在缓存大量的Db请求到memcached,这是不是可以使用Async / Await?例如我如何等待这个? public virtual Store GetStoreByUsername(string username){ return _cacheManager.Get(string.Format("Cache_Key_{0}",username),() = { return _storeRe
我的服务层正在缓存大量的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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读