使用Unity和ThreadPool对Dbcontext进行实时管理
本文关键字:实时 管理 Dbcontext Unity ThreadPool 使用 | 更新日期: 2023-09-27 18:19:32
我目前正在构建一个带有Unity和Entity框架的ASP.NET MVC应用程序。我使用的是Unity MVC 3设置,它使用ContainerControlledLifetimeManager来解决依赖关系(http://devtrends.co.uk/blog/introducing-the-unity.mvc3-nuget-package-to-reconcile-mvc3-unity-and-idisposable)。在页面加载后,我尝试启动另一个线程来执行耗时的任务,并且用户收到更新之前,这种方法一直很好。从线程中,我得到了这个错误:
The operation cannot be completed because the DbContext has been disposed.
我相信这是因为主线程已经完成,所以容器和它的子线程被处理掉了。有人知道解决这个问题的办法吗?
谢谢!
将依赖项注入控制器的标准上下文生存期处理在您的场景中无法工作,因为您希望在注入的上下文的预期生存期之后使用它(控制器已经发布)。
您的耗时操作必须引用另一个统一容器,并且必须请求使用Transient或PerResolve生存期管理器解析新的上下文实例。当操作完成或中止时,它必须处理上下文处理。
在ASP.NET(或任何IIS托管的)应用程序中跨IMHO自定义线程不是一个好主意。
通常情况下,问题是在控制器中有以下代码:
public ActionResult Blah()
{
MyViewModel model = new MyViewModel();
using (var dbc = new MyDbContext())
{
model.items = from x in dbc.items select x;
}
View(model)
}
在这种情况下,items
尚未解决,因此解决方案为:
model.items = (from x in dbc.items select x).ToList();