我有一个ASP.Net应用程序,触发关闭使用ThreadPool.QueueUserWorkItem()的一些背景工人。在大多数情况下会出现运行零个背景线程,但它可能是有可能偶尔可达5-6在同一时间执行。此外,大多数会在几秒钟内完成,但有可能是他们能为只要10分钟。

鉴于所有的不同的场景可能导致的ASP.Net应用程序的关闭,我想摆好如果可能有这些后台进程出口,当应用程序需要关闭和它们在处理的中间。

我不期待有太多的创建方式信号的过程要提前停止他们的工作和取得的呼叫应用程序正在关闭的几秒钟内清理的问题。虽然如果有人对此有具体的建议我当然感激不尽。

我的两个主要问题是:

1)当将适当的时间来告诉背景工人包裹东西。在Application_End? Dispose()方法?或者,也许第三个选择,我不知道的。

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();
}

谢谢!

有帮助吗?

解决方案

在适当的时间上的 Application_End

现在你显示你的后台作业后,必须在该点结束等待他们,然后让继续下去,因为它似乎是你做的。

在我的,这是很好的放置超时的等待,不是永远等下去,否则你的池可能有问题,或者关机,那么你需要检查的最长等待关机池的池设置有比你的等待禁用它设置一个值时,或只是。

也有在矿井,如果你有游泳池花园,(超过1个工作池),则Application_End调用一次为每个池。

我使用同样的方法在我的网站,以同样的方式I信号我的线程停止以同样的方式,我也只是记录了最后的最后,检查时,他们最后的最后,也是我强迫我的程序停止,并不能让他们跑了很多时间。该Application_End被称为上回收池,或当您打开app_offline.htm文件,或者当你去关闭Web服务。我个人有禁用的再循环,我不需要他们,我只打开app_offline.htm当我进行更新。在那一刻,我等待我的池中的线程停止自己的工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top