【问题标题】:Asp.net - how to know when a thread diesAsp.net - 如何知道线程何时死亡
【发布时间】:2017-01-20 21:08:42
【问题描述】:

我正在用 Asp.net 构建一个 Web 应用程序。我有可能会或可能不会完成的长时间运行的任务,因为 IIS 往往会终止长时间运行的任务。

问题?没有。我使用石英定期重启死掉的任务(因为更改保存在数据库中,所以我们需要做的就是重启线程)。

但现在我正在尝试构建我的 Web 应用程序以支持横向扩展。我想运行多个实例。

所以,为了处理我长时间运行的任务,我正在考虑在我的数据库中添加一个列,以记录哪个实例“签出”了给定任务。但是,我需要知道线程何时终止,以便确保它已“签入”。

那么我如何检查线程何时死亡?

【问题讨论】:

  • 如果 AppPool 在线程运行时回收会发生什么?这种方法存在多个问题,比您的问题更广泛、更复杂。
  • 既然您已经在使用 Quartz,我建议您在那里运行您长时间运行的任务。 Web 应用程序不应该做那种工作。
  • 我无法真正做到这一点,因为我正在处理向我的 Web 服务器发送 HTTP 回调的外部服务,这会改变我们的数据以及长时间运行的任务需要运行的方式。
  • 您是否考虑过 QueueBackgroundWorkItemfinally 块?我想它会解决你的问题。
  • 所以我已经在使用 QueueBackgroundWorkItem,并且我已经考虑过 finally 块,但是如果你会看到下面的对话,其他人似乎并不认为 finally 可以保证运行。

标签: c# asp.net multithreading long-running-processes


【解决方案1】:

IIS 不会杀死线程,它会杀死 AppDomain。我知道的唯一方法是让它在运行时写一个条目作为心跳信号。如果心跳停止,则线程死亡。

【讨论】:

  • 我正在使用一个名为 Quartz 的现有库。 mikesdotnetting.com/article/254/…
  • 对不起,忽略了这一点,第一段仍然是相关的。
  • 我找到了这个。 stackoverflow.com/questions/8173570/…finally 你觉得用什么?如果 IIS 杀死 AppDomain,你认为 finally 会被调用吗?
  • @ScubaSteve 正如我在上面的评论中提到的那样,这种方法仍然不能保护您免受 AppPool 回收之类的事情的影响,它会中止内存中的所有内容,包括您的线程,从而阻止调用 finally 块。
  • 如果AppPool被回收,您认为实例ID会改变吗?我想我可以让实例负责他们签出的任务,并使用我的 Quartz 实现来检查任务是否已被实例孤立。 edit 这就是它的工作方式,减去实例化
猜你喜欢
  • 2011-04-10
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多