Укладка в ожидании ключевых слов - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь уменьшить код базовой платы, получая данные из моего хранилища кеша.Я в основном копировал и вставлял один и тот же код снова и снова, поэтому я поместил всю эту логику в новый класс, CacheReadCommand.Я пытаюсь сделать это с помощью async / await, так как в моем хранилище базы данных уже реализован async / await.В итоге получилось, что я получил этот стек ожидающих ключевых слов при попытке выполнить CacheReadCommand.Read.Это на самом деле ничего не возвращает и оставляет приложение зависшим.Где я тут ошибся?

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 голосов
/ 20 ноября 2018

Если вы хотите дать асинхронный запрос вашей функции чтения, вам нужно явно запросить 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;
}
...