【问题标题】:Long-running background process in ASP.NET - Application_Start or separate process?ASP.NET 中长时间运行的后台进程 - Application_Start 还是单独的进程?
【发布时间】:2012-01-14 04:07:06
【问题描述】:

我正在开发一个需要运行后端工作线程的 .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) 更加隔离,但感觉更加混乱。

最好的方法是什么?

【问题讨论】:

标签: asp.net .net threadpool


【解决方案1】:

考虑像Hangfire 这样简单的事情,然后考虑the design points in this related answer

【讨论】:

    【解决方案2】:

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

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

    还有更多。

    【讨论】:

    猜你喜欢
    • 2018-02-05
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多