我正在开发一个繁重的MVC例程,它将延迟几分钟的处理时间。然后我调用一个Ajax请求,如果进程正确启动并且继续使用Thread执行它,我想从控制器向接口发送一个答案。但是,当发送返回时,需要访问数据库,并且我有以下错误:对象已处理。
我的代码:
var entidade = this._repositorioDeTabelaDePremiacaoUPL.ObterPorID(dto.ID);
if(entidade.StatusDoServico == ListaDeStatusDoServico.tcProcessando.Id)
return Content("{success:false}");
Thread thread = new Thread(() => this._servicoDeTabelaDePremiacaoUPL.GerarTabela(dto));
thread.Start();
GerenciadorDeUnidadeDeTrabalho.Corrente.Commit();
return Content("{success:true}");
答案 0 :(得分:1)
我建议为你的线程使用额外的db上下文并在最后处理它。因为Web应用程序和额外线程的db上下文具有不同的生命周期。对于Web应用程序,它基本上是每个HttpContext - web请求,而对于线程来说它是线程的生命周期。您可以自己创建数据库上下文的新实例,也可以使用某些Conditional object construction。
注意:
在应用程序的整个生命周期中重用db上下文并将其作为静态属性引用并不是一个很好的做法(它可能导致并发问题,并且上下文中的实体状态可能会变得不一致)。更好的方法是在HTTPContext范围(InstanceScope.HttpContext
)中注册db上下文,然后在控制器上使用构造函数注入。
<强> Global.asax中强>
ObjectFactory.Configure(i => { i.For<ContextoBase>().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.HttpContext)).Use<ContextoDaAplicacao>(); }
<强>控制器强>
public MyController(ContextoBase context){
this.context = context;
}
// then use it in action methods (note: it will be automatically disposed at the end of the web request)