为什么StructureMap容器调用GetInstance方法时不返回控制权?
StructureMap调用GetInstance无响应问题原因及解决方案
根本原因
- 你注入的
IContainer实例为请求作用域的嵌套容器(Nested Container):StructureMap与ASP.NET HTTP管道集成时,会为每个HTTP请求创建独立的嵌套容器,请求处理完毕返回响应后,该嵌套容器会被自动标记销毁并持有内部操作锁。 - 后台任务通过
Task.Run启动后,主线程直接返回了响应,HTTP请求生命周期已经结束,对应的嵌套容器已经进入销毁流程。此时在后台线程调用GetInstance方法时,会持续等待容器的内部锁释放,而销毁流程的锁不会正常释放,最终触发死锁导致无响应。 - 将
GetBookExporter调用放在Task.Run之前时,HTTP请求尚未结束,嵌套容器仍处于存活可访问状态,因此可以正常解析依赖。
解决方案
- 方案1:在请求线程中提前完成所有服务解析,将解析好的实例传入后台任务使用,这是成本最低的适配方案,也是你已经验证过的可行方案。
- 方案2:如果必须在后台任务中动态解析服务,不要直接注入请求作用域的
IContainer,改为注入StructureMap的根容器,或者在启动后台任务时从根容器创建独立的新嵌套容器供后台任务使用,完全脱离请求作用域的生命周期限制。 - 方案3:如果是长周期的后台导出任务,推荐使用独立的服务作用域处理逻辑,不要耦合HTTP请求的生命周期。
内容的提问来源于stack exchange,提问作者Denis Kaminsky
相关产品推荐
相关产品推荐

