C# 当与Lazy一起使用时,如何从MemoryCache中识别和排除异常<;T>;?

C# 当与Lazy一起使用时,如何从MemoryCache中识别和排除异常<;T>;?,c#,.net,.net-core,memorycache,C#,.net,.net Core,Memorycache,我正在与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());

我正在与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;
}
但是只要调用
oldValue.Value
就会抛出异常


如何识别oldValue对象是否包含异常并相应地处理它?

这是错误的方法。它永远不适用于惰性计算,尤其是当您必须将其提升到多线程环境中一次时。将(理想情况下,纯-即无状态)回调
Action
作为可选参数传递,并确保有合理但通用的足够的默认实现

或者,至少,提供您的自定义
例外Warelazy
,它将保存适当的标志。这样的解决方案会更糟糕,但是没有异步回调会困扰您


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

正确的反应是什么?如果删除该值,同一缓存项的同一异常将不会再次发生,并且您将陷入无休止的循环中吗?如果您在catch处理程序中重试该操作,然后再次调用GetFromCache,则会使用StackoverFlowException快速终止您的应用程序,该异常仅在您返回异常时发生。因为您已经用这个方法包装了对缓存的访问,所以您可以在那里捕获异常,但是问题仍然存在,您想做什么?再试一次?
var v = GetFromCache<Prop>(request.Key, () => LongCalc());
if (oldValue != null && oldValue.Value.GetType() == typeof(Exception)) {
  cache.Remove(key, CacheEntryRemovedReason.Evicted);
}