c# – 异步/等待和缓存

前端之家收集整理的这篇文章主要介绍了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;
}
原文链接:https://www.f2er.com/csharp/94195.html

猜你在找的C#相关文章