Я немного запутался с асинхронной и лямбда-функцией.
У меня есть старая функция CacheHelper (в основном шаблон в стороне от кэша), которая делает это:
public static T GetOrAdd<T>(Func<Task<T>> builder, TimeSpan expiresIn, bool ignoreNullValues, params string[] keys)
{
////check if the cache item is available
xxxx
//// if not, call the builder function to get fresh
var item = builder().Result;
//// add to cache and return the item
return item;
}
Теперь мы переходим к асинхронному шаблону, поэтому я вызываю помощника кеша:
CacheAsideHelper.GetOrAdd(
async () => await _currencyRepository.GetCurrencyInfo(currencyCode, commandTimeout, taskTimeout, _trackingId),
new TimeSpan(Constants.ExpirationDays, 0, 0), true, key);
Я запускаю несколько тестов и, кажется, результат ожидаемый. Но один из моих коллег сказал, что, поскольку я передаю асинхронную лямду, мой кеш иногда может содержать Task<T>
, отличный от объекта T. Так что мне как-то нужно его подождать.
Однако мой тест, похоже, дает правильные данные, в том числе и в моем вспомогательном коде Cache, как у меня
var item = builder().Result;
Кэш всегда будет содержать реальные данные (кроме Task<T>
). Я прав или мой коллега прав?