【发布时间】:2017-01-20 21:08:42
【问题描述】:
我正在用 Asp.net 构建一个 Web 应用程序。我有可能会或可能不会完成的长时间运行的任务,因为 IIS 往往会终止长时间运行的任务。
问题?没有。我使用石英定期重启死掉的任务(因为更改保存在数据库中,所以我们需要做的就是重启线程)。
但现在我正在尝试构建我的 Web 应用程序以支持横向扩展。我想运行多个实例。
所以,为了处理我长时间运行的任务,我正在考虑在我的数据库中添加一个列,以记录哪个实例“签出”了给定任务。但是,我需要知道线程何时终止,以便确保它已“签入”。
那么我如何检查线程何时死亡?
【问题讨论】:
-
如果 AppPool 在线程运行时回收会发生什么?这种方法存在多个问题,比您的问题更广泛、更复杂。
-
既然您已经在使用 Quartz,我建议您在那里运行您长时间运行的任务。 Web 应用程序不应该做那种工作。
-
我无法真正做到这一点,因为我正在处理向我的 Web 服务器发送 HTTP 回调的外部服务,这会改变我们的数据以及长时间运行的任务需要运行的方式。
-
您是否考虑过
QueueBackgroundWorkItem和finally块?我想它会解决你的问题。 -
所以我已经在使用 QueueBackgroundWorkItem,并且我已经考虑过 finally 块,但是如果你会看到下面的对话,其他人似乎并不认为 finally 可以保证运行。
标签: c# asp.net multithreading long-running-processes