0

我有一个 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();
}

谢谢!

4

1 回答 1

1

合适的时间在Application_End

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

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

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

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

于 2011-01-06T17:26:14.250 回答