我正在尝试减少从缓存存储库中获取数据的样板代码。我基本上是一遍又一遍地复制和粘贴相同的代码,因此我将所有逻辑都放入了一个新类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));
}
答案 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;
}