Application_End 和后台进程,优雅地退出 ASP.Net 应用程序

Posted

技术标签:

【中文标题】Application_End 和后台进程,优雅地退出 ASP.Net 应用程序【英文标题】:Application_End and background processes, exiting ASP.Net application gracefully 【发布时间】:2011-01-06 17:13:46 【问题描述】:

我有一个 ASP.Net 应用程序,它使用 ThreadPool.QueueUserWorkItem() 触发一些后台工作人员。大多数情况下,运行的后台线程为零,但有时可能一次执行多达 5-6 个。此外,大多数将在几秒钟内完成,但它们可能会运行长达 10 分钟。

考虑到可能导致 ASP.Net 应用程序关闭的所有不同情况,如果可能,我希望这些后台进程在应用程序需要关闭并且它们正在处理中时正常退出。

我预计创建一种方法来通知进程提前停止工作并在接到应用程序正在关闭的呼叫后几秒钟内进行清理不会有太多问题。虽然如果有人对此有具体建议,我当然会很感激。

我的两个主要问题是:

1) 什么时候是告诉后台工作人员收拾东西的合适时间。在 Application_End 期间?处置()?或者也许是我不知道的第三种选择。

2) 如果我在上述事件期间等待进程完成后再返回,是否存在不立即返回 Application_End 可能会导致应用程序出现比不关闭后台作业更严重的问题。

void Application_End(object sender, EventArgs e) 

    //if this for whatever reason takes a non-trivial time to execute, what problems could I encounter? 
    SignalBackgroundJobsAndWaitForThemToShutDown();

谢谢!

【问题讨论】:

【参考方案1】:

适当的时间在Application_End

现在,在您向后台作业发出信号后,您必须在此时等待它们结束,然后继续,就像您所做的那样。

有我的,最好设置一个等待时间,不要永远等待,否则你的池可能有问题,或者关闭,那么你需要检查你的池设置在最大等待以关闭池,设置的值大于您的等待值,或者只是禁用它。

我也有,如果您有泳池花园(超过 1 个工作池),那么每个泳池都会调用一次 Application_End。

我在我的网站上使用相同的技术,以相同的方式向我的线程发出信号以相同的方式停止,我还记录最终结束,并检查它们何时是最终结束,并且我强制我的例程停止并不让他们跑很多次。 Application_End 在回收池时调用,或者当您打开 app_offline.htm 文件时,或者当您关闭 Web 服务时。我个人禁用了回收,我不需要它们,我只在更新时打开 app_offline.htm。在那一刻,我等待池线程停止工作。

【讨论】:

感谢 Aristos,应用程序池的“关闭时间限制”属性正是我需要知道的。 (即,如果它在这段时间内没有很好地关闭,进程将终止,在我的情况下为 90 秒)。所以你的后续问题,我真的有必要让 Application_End 等到工人工作清理并完成后再返回吗?或者,我是否可以让它向工作人员发出 BEGIN 清理的信号并在此时返回 Application_End? @eoldre 是的,必须等待,否则终止线程。当 Application_End 结束时,工作池被杀死并且所有线程都消失了。如果您更改和更新 Dll 或 Web 上的页面,也会发生同样的想法。

以上是关于Application_End 和后台进程,优雅地退出 ASP.Net 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

优雅地终止从带有“start /b”的 Windows 批处理文件启动的 java (jetty/solr) 进程

在python中捕获Ctrl + C / SIGINT并优雅地退出多进程[重复]

从外部进程优雅地关闭UWP应用程序

GRPC: 如何优雅关闭进程(graceful shutdown)

如何使用 gprof 分析守护进程而不优雅地终止它?

Delphi - 优雅地关闭服务中创建的进程。 (使用 tprocess / createProcess)