我的Lazy <> value工厂中的InvalidOperationException

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

在访问该ConfigSource属性时,我遇到了这个InvalidOperationException:

ValueFactory尝试访问此实例的Value属性.

我在访问该Value属性的"值工厂"方法中看不到任何内容.还有什么可以触发这个例外吗?此问题只是间歇性地发生,但一旦发生,它需要重置IIS以清除异常(一旦发生就会缓存).

Jac*_*cob 34

事实证明,只有在尝试检查Visual Studio调试器中的Value属性时才会出现此错误Lazy<>.这样做似乎创建了一个死锁,因为Value然后访问似乎挂起了很长一段时间,直到InvalidOperationException最终发生.我永远无法拦截原作Exception,所以我看不到内部的堆栈跟踪.

我只是把它作为Visual Studio中的一个错误或者它们的实现Lazy<>.

  • +1我同意你的想法,即"Lazy <T>"的实现中存在一个错误.我今天遇到了同样的问题,我的代码中没有引发异常.为了解决我的问题,我转而使用带有`get {return _val ?? (_val = CreateVal()); }. (2认同)
  • 当我试图在网络应用程序中逐步执行代码时,Visual Studio一直悬挂(无限期?).在从进程中分离时,我将此错误抛回浏览器.根据http://stackoverflow.com/questions/3536025/why-would-the-vs2010-debugger-hang取消选中"启用属性评估和其他隐式函数调用"似乎已对其进行了排序. (2认同)

Vik*_*fer 13

ValueFactory尝试访问此实例的Value属性.

它可以帮助某人,我能够通过检查我的整个ValueFactory过程来修复该错误.在我的例子中,我创建了一个简单的模型,并将其与其他一些数据相关联,但在链接过程中,我在单例中访问了Value属性并导致了错误.

因此,访问ValueFactory中的Lazy对象的Value会引发这样的错误.由于错误消息已经指示;-)


her*_*itt 11

这也发生在循环依赖关系中,所以如果这些步骤无处可去,请尝试双重检查堆栈跟踪并验证没有循环依赖关系.


use*_*116 8

行为Lazy<T>是缓存由异常抛出的异常ValueFactory.由于InvalidOperationException消息中提供的信息很少,这可能导致可能混淆的行为.Microsoft通过Connect了解了这个问题,然而,它被标记为Wont Fix,因为他们觉得异常本身有足够的信息来诊断问题.

如果您收到的IOE存在内部异常,它应该(不会说它会)包含足够的信息来继续.另一种可能性是你有一个try...catch重新抛出异常的块(throw ex;而不是throw;),你将丢失有价值的信息.


nic*_*ojs 6

要确保未缓存异常,请使用LazyThreadSafetyMode.PublicationOnly作为第二个参数,而不是true.

使用true,您最终会得到一个LazyThreadSafetyMode.ExecutionAndPublication.这将确保只有一个线程可以进入ValueFactory方法,但也可以确保缓存异常.

  private static Lazy<ConfigSource> _cfgSrc = new Lazy<ConfigSource>(
        () => { /* "ValueFactory" here... */ },
        LazyThreadSafetyMode.PublicationOnly);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅提供的六个变量链接.