2011-12-06 89 views
8

我正在開發一個需要後端工作線程運行的.NET 4應用程序。此線程主要由以下代碼組成:ASP.NET中長時間運行的後臺進程 - Application_Start或單獨的進程?

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)更加隔離,但感覺更加混亂。

什麼是最好的方法?

+0

可能重複的[ASP.NET和長時間運行的後臺線程 - 他們如何混合?](http://stackoverflow.com/questions/323693/asp-net-and-long-running-background-threads-how -do-they-mix) – jrummell

回答

13

如果可能,我會強烈選擇Windows服務。後臺線程在ASP.NET comes with a lot of baggage中。

  1. 您的後臺進程的生命週期是由IIS的擺佈。如果IIS決定回收應用程序池,則後臺進程將重新啓動。如果IIS由於不活動而決定停止應用程序池,則後臺進程將不會運行。
  2. 如果IIS配置爲作爲Web Garden運行(每個AppPool有多個進程),那麼後臺線程可以運行多次。
  3. 稍後,如果您決定負載平衡您的網站(運行該網站的多個服務器),那麼您可能需要更改應用程序以確保後臺線程只發生在一臺服務器上)。

還有很多。

+0

「行李」已經被[Hangfire](http://hangfire.io/)等工具照顧 - 背景處理現在非常強大。 [考慮這些問題](http://stackoverflow.com/a/41734936/56145)。 –