我的Lazy <>值工厂中的InvalidOperationException

问题描述

|| 我有一个包含如下内容的类:
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属性。 我的“值工厂”方法中没有访问factory3ѭ属性的任何内容。还有什么可能触发此异常的吗?此问题只会间歇性地发生,但是一旦发生,它将需要重新设置IIS来清除异常(该异常一旦发生似乎就被缓存了)。     

解决方法

        原来,仅当尝试在Visual Studio调试器中检查ѭ5的
Value
属性时,才发生此错误。这样做似乎造成了死锁,因为访问
Value
似乎使线程挂了很长时间,直到
InvalidOperationException
最终出现。我永远无法截取原始的
Exception
,因此看不到内部堆栈跟踪。 我只是将其归类为Visual Studio中的错误或它们对ѭ5的实现。     ,           ValueFactory尝试访问此实例的Value属性。 它可能对某些人有帮助,我可以通过检查整个ValueFactory过程来解决该错误。 在我的示例中,我正在创建一个简单的模型,并将其与其他数据链接,但是在链接过程中,我以单例方式访问Value属性,这导致了错误。 因此,访问ValueFactory中的Lazy对象的Value会引发此类错误。 由于错误消息已经指示;-)     ,        循环依赖关系在我身上也发生过,因此,如果这些步骤无济于事,请尝试仔细检查stacktrace并验证是否没有循环依赖关系。     ,        “ 10”的行为是缓存“ 11”引发的异常。由于“ 2”消息中给出的信息很少,因此可能导致混乱的行为。 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);
有关更多信息,请参见提供的链接Sixletter变量。     ,        延迟加载配置时,请确保不要调用需要所述配置的方法。这将调用配置加载程序,该加载程序将重新启动该过程,从而导致所描述的错误。 就我而言,我正在记录负载状态,而记录器需要配置     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...