2011-01-06 109 views
0

我有一个ASP.Net应用程序使用ThreadPool.QueueUserWorkItem()触发一些后台工作。大多数情况下,将会有零个后台线程运行,但是有可能一次只能执行5-6个执行。此外,大部分会在几秒钟内完成,但有可能会运行长达10分钟。Application_End和后台进程,优雅地退出ASP.Net应用程序

鉴于所有可能导致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(); 
} 

谢谢!

回答

1

合适的时间是在Application_End

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

有我的,这是很好的放置在等待的时间,不要等到永远或者你的池可能有问题,或关机,然后你需要检查你的池设置最大等待关机游泳池,设置一个比你的等待更大的值,或者只是禁用它。

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

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

+0

感谢Aristos,应用程序池的“关闭时间限制”属性正是我需要知道的。 (也就是说,如果在这段时间内没有很好地关闭,在我的情况下为90秒,则进程将终止)。所以后续问题对你来说,实际上是否有必要让Application_End等到worker作业清理完成并返回之前完成?或者,我可以让它告诉工作人员BEGIN清理并在那时返回Application_End? – eoldre 2011-01-06 18:43:32