Asp.net

我可以使用執行緒在 IIS 上執行長時間執行的作業嗎?

  • February 11, 2009

在 ASP.Net 應用程序中,使用者點擊網頁上的按鈕,然後通過事件處理程序實例化伺服器上的對象並呼叫對像上的方法。該方法轉到外部系統來做一些事情,這可能需要一段時間。所以,我想做的是在另一個執行緒中執行該方法呼叫,這樣我就可以通過“您的請求已送出”將控制權返回給使用者。我很高興將其作為即發即棄的方式進行,儘管如果使用者可以繼續輪詢對象的狀態會更好。

我不知道 IIS 是否允許我的執行緒繼續執行,即使使用者會話過期也是如此。想像一下,使用者觸發事件,我們在伺服器上實例化對象並在新執行緒中觸發方法。使用者對“您的請求已送出”消息感到滿意並關閉了他的瀏覽器。最終,此使用者會話將在 IIS 上超時,但執行緒可能仍在執行,正在工作。IIS 會允許執行緒繼續執行,還是會在使用者會話到期後終止它並處理對象?

編輯:從答案和評論中,我了解到最好的方法是將長期執行的處理移到 IIS 之外。除此之外,這還涉及 appdomain 回收問題。在實踐中,我需要在有限的時間內啟動版本 1,並且必須在現有框架內工作,所以想避開服務層,因此希望只在 IIS 內啟動執行緒。在實踐中,這裡的“長時間執行”只會是幾分鐘,網站上的並發會很低,所以應該沒問題。但是,下一個版本肯定需要拆分成一個單獨的服務層。

你可以完成你想要的,但這通常是個壞主意。一些 ASP.NET 部落格和 CMS 引擎採用這種方法,因為它們希望可安裝在共享主機系統上,而不依賴於需要安裝的 Windows 服務。通常,當應用程序啟動時,他們會在 Global.asax 中啟動一個長時間執行的執行緒,並讓該執行緒程序將任務排隊。

除了減少 IIS/ASP.NET 可用於處理請求的資源之外,您還遇到了在回收 AppDomain 時執行緒被殺死的問題,然後您必須在任務執行時處理任務的持久性,如以及在 AppDomain 恢復時開始備份工作。

請記住,在許多情況下,AppDomain 會以預設間隔自動回收,以及更新 web.config 等。

如果您可以隨時處理執行緒被殺死的持久性和事務方面,那麼您可以通過一些外部程序在您的站點上每隔一段時間發出請求來繞過 AppDomain 回收 - 這樣如果站點被回收,您保證在 X 分鐘內自動重新啟動。

同樣,這通常是一個壞主意。

編輯:以下是這種技術的一些實際應用範例:

社區伺服器:使用 Windows 服務與後台執行緒以計劃的時間間隔執行程式碼在 網站首次啟動時創建後台執行緒

編輯(來自遙遠的未來) - 這些天我會使用Hangfire

引用自:https://stackoverflow.com/questions/536681