Jac*_*cob 38 c# .net-4.0 lazy-evaluation
我有一个包含以下内容的类:
public static class Config
{
    private static Lazy<ConfigSource> _cfgSrc = new Lazy<ConfigSource>(
        () => { /* "ValueFactory" here... */ },
        true);
    public static ConfigSource ConfigSource
    {
        get { return _cfgSrc.Value; }
    }
}
在访问该ConfigSource属性时,我遇到了这个InvalidOperationException:
ValueFactory尝试访问此实例的Value属性.
我在访问该Value属性的"值工厂"方法中看不到任何内容.还有什么可以触发这个例外吗?此问题只是间歇性地发生,但一旦发生,它需要重置IIS以清除异常(一旦发生就会缓存).
Jac*_*cob 34
事实证明,只有在尝试检查Visual Studio调试器中的Value属性时才会出现此错误Lazy<>.这样做似乎创建了一个死锁,因为Value然后访问似乎挂起了很长一段时间,直到InvalidOperationException最终发生.我永远无法拦截原作Exception,所以我看不到内部的堆栈跟踪.
我只是把它作为Visual Studio中的一个错误或者它们的实现Lazy<>.
Vik*_*fer 13
ValueFactory尝试访问此实例的Value属性.
它可以帮助某人,我能够通过检查我的整个ValueFactory过程来修复该错误.在我的例子中,我创建了一个简单的模型,并将其与其他一些数据相关联,但在链接过程中,我在单例中访问了Value属性并导致了错误.
因此,访问ValueFactory中的Lazy对象的Value会引发这样的错误.由于错误消息已经指示;-)
行为Lazy<T>是缓存由异常抛出的异常ValueFactory.由于InvalidOperationException消息中提供的信息很少,这可能导致可能混淆的行为.Microsoft通过Connect了解了这个问题,然而,它被标记为Wont Fix,因为他们觉得异常本身有足够的信息来诊断问题.
如果您收到的IOE存在内部异常,它应该(不会说它会)包含足够的信息来继续.另一种可能性是你有一个try...catch重新抛出异常的块(throw ex;而不是throw;),你将丢失有价值的信息.
要确保未缓存异常,请使用LazyThreadSafetyMode.PublicationOnly作为第二个参数,而不是true.
使用true,您最终会得到一个LazyThreadSafetyMode.ExecutionAndPublication.这将确保只有一个线程可以进入ValueFactory方法,但也可以确保缓存异常.
  private static Lazy<ConfigSource> _cfgSrc = new Lazy<ConfigSource>(
        () => { /* "ValueFactory" here... */ },
        LazyThreadSafetyMode.PublicationOnly);
有关详细信息,请参阅提供的六个变量链接.
| 归档时间: | 
 | 
| 查看次数: | 21697 次 | 
| 最近记录: |