为了账号安全,请及时绑定邮箱和手机立即绑定

与 Lazy<T> 一起使用时如何识别和排除 MemoryCache 中的异常?

与 Lazy<T> 一起使用时如何识别和排除 MemoryCache 中的异常?

C#
阿波罗的战车 2022-10-23 13:56:11
我在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 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

那是错误的做法。它永远不会与惰性评估一起使用,特别是如果您必须将其提升到多线程环境一次。传递一个(理想情况下,纯 - 即无状态)回调Action<Exception>作为可选参数,并确保有合理但足够通用的默认实现。

或者,至少,提供您的自定义ExceptionAwareLazy<T>,它将持有适当的标志。这样的解决方案会更糟,但是没有异步回调会打扰您。

PSReactiveExtensions是我建议的方法的好例子。您可以轻松地将您的解决方案包装到TaskCompletionSource并坚持使用众所周知的async/await.


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 63 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信