我在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 对象是否包含异常并进行相应处理?
1 回答
![?](http://img1.sycdn.imooc.com/54584dc4000118d302200220-100-100.jpg)
MYYA
TA贡献1868条经验 获得超4个赞
那是错误的做法。它永远不会与惰性评估一起使用,特别是如果您必须将其提升到多线程环境一次。传递一个(理想情况下,纯 - 即无状态)回调Action<Exception>
作为可选参数,并确保有合理但足够通用的默认实现。
或者,至少,提供您的自定义ExceptionAwareLazy<T>
,它将持有适当的标志。这样的解决方案会更糟,但是没有异步回调会打扰您。
PSReactiveExtensions
是我建议的方法的好例子。您可以轻松地将您的解决方案包装到TaskCompletionSource
并坚持使用众所周知的async/await
.
- 1 回答
- 0 关注
- 75 浏览
添加回答
举报
0/150
提交
取消