ASP.NET中长时间运行的后台进程 - Application_Start还是单独的进程?

时间:2011-12-06 14:55:16

标签: asp.net .net threadpool

我正在开发一个需要后端工作线程运行的.NET 4应用程序。该主题主要包含以下代码:

while (true) {
    //Check stuff in database
    //Do stuff
    //write to database / filesystem
    Thread.sleep(60000)
}

ASP.NET应用程序只是数据库的前端。

我的问题在于放置这个工作循环的最佳位置。看来我的两个选择是(1)将它从Application_Start方法中分离出来,然后让它运行,或者(2)将它捆绑在一个单独的进程中(Windows服务?)

(1)显然需要ASP.NET代码中的一些逻辑来检查它是否仍在运行,因为IIS可能会将其终止。整个应用程序逻辑在一个易于部署的软件包中也非常简洁。 (2)更加隔离,但感觉更麻烦。

最好的方法是什么?

2 个答案:

答案 0 :(得分:14)

如果可能,我会强烈选择Windows服务。 ASP.NET comes with a lot of baggage中的背景线程。

  1. 后台进程的生命周期受IIS的限制。如果IIS决定回收应用程序池的时间,则后台进程将重新启动。如果IIS由于不活动而决定停止应用程序池,则后台进程将无法运行。
  2. 如果IIS配置为作为Web Garden运行(每个AppPool有多个进程),那么您的后台线程可以运行多次。
  3. 稍后,如果您决定对您的网站(运行该网站的多台服务器)进行负载均衡,那么您可能需要更改您的应用程序以确保后台线程仅在一台服务器上进行。)
  4. 还有更多。

答案 1 :(得分:0)

考虑像Hangfire之类的简单内容,然后考虑the design points in this related answer