【发布时间】:2020-01-09 04:12:44
【问题描述】:
我们的 Web 应用程序使用在 loab 平衡器和 Angular 客户端上运行的 .net-core Web api。我们使用 EF 核心访问数据库。 我们有一个长时间运行的后台任务,它会进行大量计算,大约需要 2-3 小时才能完成,但每年只会由应用程序管理员启动 3-4 次。 在作业运行时,我们希望阻止用户添加/编辑/删除数据,我们的客户告诉我们,如果应用程序在此期间不可用,这甚至可以,因为他们通常会在一夜之间完成。 最简单的方法是在作业运行时将用户重定向到信息页面,但如果任务正在运行,我发现无法实际获取信息。
我可以设置一个标记来判断作业是否正在运行,然后在每次请求时检查该标记,但我发现无法访问应用程序范围的状态。
我无法将标志保存到数据库,因为在作业结束时(约 1 小时)提交事务时,我们无法从数据库中读取数据
最让我困惑的是,我还没有找到一篇文章或问题关于这样的问题对我来说似乎不太奇怪,所以我想我遗漏了一些非常明显的东西。
【问题讨论】:
-
这是题外话,我猜,但你可以使用专用的 Redis 服务器来存储这个标志
-
使用hangfire代替后台任务并检查作业是否正在运行?如果您在负载均衡器后面,如何保证只有 1 个实例在执行作业?
-
虽然它确实在后台运行,但我们确实使用 signalR 将进度推送到 UI,所以我不知道 hangfire 是否适用。
标签: c# asp.net-core entity-framework-core asp.net-core-2.0 asp.net-core-webapi