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

gro*_*wse 10 .net asp.net threadpool

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

while (true) {
    //Check stuff in database
    //Do stuff
    //write to database / filesystem
    Thread.sleep(60000)
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

什么是最好的方法?

vcs*_*nes 14

如果可能的话,我会强烈选择Windows服务.ASP.NET中的背景线程带来了很多包袱.

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

还有更多.