【发布时间】:2019-06-06 08:19:47
【问题描述】:
我在一家自动化公司工作,因此我们为工业自动化创建流程。以前这种自动化是在机器方面完成的,但我们正在慢慢过渡到使用 c# 控制机器。
在我目前的项目中,一天的制作大约需要 2 个小时。工厂的操作员有一个我们在 c# 中使用 asp.net core MVC 创建的 Web 界面,他们可以在其中启动/暂停/停止这个生产过程。
在启动过程时,我们在控制器中等待一个函数,该函数基本上是一个 while 循环,用于控制这个长达 2 小时的生产过程。
现在的问题是,当我发出 REST 请求开始生产时,这个请求需要 2 小时才能完成,我希望这个请求立即完成,并且生产过程在我的 asp.net 核心应用程序的后台开始。
首先我认为我可以省略等待,只需在我的控制器中执行此操作(简化代码):
_ = _productionController.StartLongProcess(); // This contains the while loop
return Ok();
但是由于 _productionController 是作用域的,并且它的所有依赖项也是如此,所以当方法返回时,它们会立即被处理掉,例如,我不能再访问我的数据库了。
该流程应该能够不断地与我们的数据库通信,以保存有关生产流程的信息,以防万一出现故障,这样我们就可以始终从中断的地方继续。
我现在向您提出的问题是,我们是否以错误的方式解决这个问题?我认为在 asp.net 控制器中启动这些长时间运行的进程是一种不好的做法。
如何确保在这个长时间运行的进程中始终可以访问我的 DatabaseContext,即使 REST 请求已经结束。仅为此方法创建单独的范围?
【问题讨论】:
-
如果您使用 Db 上下文进行异步调用,那么由于调用进入后台,因此它不是对系统资源的阻塞操作,这就是进行任何异步调用的方式
-
这些在方法返回时立即被处理掉:创建一个
ProcessManager类,将其注册为服务,将该服务注入控制器,通过@987654323启动进程@ .由于这个ProcessManager是由DI容器管理的,所以控制器动作返回时不会被释放。 -
@itminus 您将使用哪个 DI 容器设置/配置来避免 Dispose,它肯定会管理对象生命周期,但不会发布调用返回,除非您将其设为单例,但这不是这是个好主意
标签: c# rest asp.net-core