Я использую следующий шаблон с MemoryCache:
public static T GetFromCache<T>(string key, Func<T> valueFactory) {
var newValue = new Lazy<T>(valueFactory);
var oldValue = (Lazy<T>)cache.AddOrGetExisting(key, newValue, new CacheItemPolicy());
return (oldValue ?? newValue).Value;
}
И назовите это:
var v = GetFromCache<Prop>(request.Key, () => LongCalc());
Это работает достаточно хорошо. Однако, когда LongCalc
выдает исключение, cache.AddOrGetExisting
сохраняет исключение в кеш.
Я пытаюсь определить, когда это произойдет:
if (oldValue != null && oldValue.Value.GetType() == typeof(Exception)) {
cache.Remove(key, CacheEntryRemovedReason.Evicted);
}
но простой вызов oldValue.Value
вызывает исключение.
Как я могу определить, содержит ли объект oldValue исключение, и обработать его соответствующим образом?