我有一个场景,涉及每个" session"的单独寿命镜,并在工作线程中长期解决。我遇到一个不稳定的错误,这可能有时间安排 - 在实际分辨率有机会完成之前,终身范围被处置/创建时会发生。
我有点无知,因为例外有点隐秘 - 嵌套依赖关系exception和InvalidoperationException的几层层,底部有以下消息:"容器对上下文界面的自我注册绝对不应被激活,因为它是在LifeTimesCope类中的。"
>投掷它的自动式代码也没有显示太多 -> https://github.com/autofac/autofac/autofac/blob/d44e09d37863e13aaa09eefa6f249caf149caf1e5caf1e5caf0f1/src/src/autofac/autofac/autofac/core/core/cortearnainer/container/container/container/container-cortenainer-cortener.cty>
在什么条件下,这个例外实际上抛出了?
如果您有一个多线程的方案,其中您要在单独的线程上进行分辨率(这是您描述的),那么您将必须在终生范围内进行很多锁定创建和处置。在试图解决一生范围中的某些东西的同时处置一生的范围将使您陷入困境。结果是,您会看到奇怪的消息没有很多意义。
实际上走回代码,以找出您可以遇到此错误的所有方法可能会导致其中一个(或更多)这些结果:
- 这将需要很多时间。
- 这真的很困惑,很难破译您的发现。
- 最终并不重要,因为解决方案将非常谨慎,多线程和范围创建/处置。
举例来说,AutoFac在一段时间内有一个长期运行的问题,在该父母终身范围上不处理该父母产生的任何子范围。我们为其进行了很长一段时间的修复工作,但事实证明,通过跟踪范围的层次结构,它很容易在高流量中引入内存泄漏,例如每个请求的终身范围。最终结果是wontfix
,因为如果您旋转终身范围,那么您也应该非常负责拆除它们。
总的来说,决心操作很像构造函数 - 它们应该非常快,原子,不需要多线程。一旦您不得不产生一个工作线程才能执行一个需要很长时间的决心...这更是一个架构问题。