如何解决我的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变量。
, 延迟加载配置时,请确保不要调用需要所述配置的方法。这将调用配置加载程序,该加载程序将重新启动该过程,从而导致所描述的错误。
就我而言,我正在记录负载状态,而记录器需要配置
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。