1

我正在开发一个繁重的 MVC 例程,它会延迟几分钟的处理时间。然后我调用一个 Ajax 请求,如果进程已正确启动,我想从控制器向接口发送一个答案,并继续使用线程执行它。但是,发送返回时,需要访问数据库,并且出现以下错误:对象已释放。

我的代码:

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}");
4

1 回答 1

1

我建议为您的线程使用额外的数据库上下文并在最后处理它。因为您的 Web 应用程序和额外线程的数据库上下文具有不同的生命周期。对于 Web 应用程序,它通常是每个 HttpContext - Web 请求,对于线程,它是线程的生命周期。您可以自己创建数据库上下文的新实例,也可以使用一些条件对象构造

笔记:

在应用程序的整个生命周期中重用数据库上下文并将其作为静态属性引用不是一个很好的做法(它可能导致并发问题并且上下文中的实体状态可能变得不一致)。更好的方法是在 HTTPContext 范围 ( InstanceScope.HttpContext) 中注册您的数据库上下文,然后在您的控制器上使用构造函数注入。

全球.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)
于 2013-01-28T13:41:52.753 回答