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