Controller返回时线程死亡

时间:2013-01-28 11:24:42

标签: c# asp.net-mvc entity-framework dependency-injection structuremap

我正在开发一个繁重的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}");

1 个答案:

答案 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)