控制器返回时线程死亡

本文关键字:线程 返回 控制器 | 更新日期: 2023-09-27 17:56:31

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

控制器返回时线程死亡

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

笔记:

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

全球

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)