堆叠等待关键字

时间:2018-11-19 21:38:56

标签: c# async-await delegates

我正在尝试减少从缓存存储库中获取数据的样板代码。我基本上是一遍又一遍地复制和粘贴相同的代码,因此我将所有逻辑都放入了一个新类CacheReadCommand中。我正在尝试使用async / await进行此操作,因为我的数据库存储库已经实现了async / await。最终发生的事情是,当我尝试执行CacheReadCommand.Read时得到了这堆await关键字。这实际上并没有返回任何信息并使应用程序挂断。我在哪里错了?

CacheReadCommand

public class CacheReadCommand : ICacheReadCommand {
    private readonly ICacheRepository _repo;

    public CacheReadCommand(ICacheRepository repo) {
        _repo = repo;
    }

    public async Task<T> Read<T>(string cacheKey, Func<T> query) {
        T retVal = await _repo.GetValue<T>(cacheKey);

        if(retVal == null) {
            retVal = query.Invoke();

            if(retVal != null) {
                await _repo.SetValue<T>(cacheKey, retVal);
            }
        }

        return retVal;
    }
}

**设置存储库**

    public async Task<Setting> GetSetting(Guid guid, string key) {
        string cacheKey = $"GetSetting_{guid}_{key}";

        return await await _readCommand.Read(cacheKey, async () => await ReadOne<Setting>("GetSetting", guid));
    }

    protected async Task<T> ReadOne<T>(string sql, Guid siteGuid) {
        DynamicParameters parms = new DynamicParameters();
        parms.Add(PARMNAME_GUID, siteGuid.ToFormattedString());

        return await ReadOne<T>(GetCommandDefinition(sql, parms));
    }

1 个答案:

答案 0 :(得分:0)

如果要对Read函数进行异步查询,则需要明确要求Func<Task<T>>并等待它。现在,您正在对委托调用Invoke(),它返回一个Task<Setting>

因此,您应该执行以下操作:

public async Task<T> Read<T>(string cacheKey, Func<Task<T>> query) {
    T retVal = await _repo.GetValue<T>(cacheKey);

    if(retVal == null) {
        retVal = await query();

        if(retVal != null) {
            await _repo.SetValue<T>(cacheKey, retVal);
        }
    }

    return retVal;
}