2013-07-18 92 views
0

長如何運行線程工作,所以我有MVC控制器方法中下面的代碼:內部Web應用程序

public ActionResult ProcessFile() 
{ 
    ThreadStart threadStart = new ThreadStart (()=>{ 

     // Doing some long processing that takes 20 minute 
    }); 

    Thread thread = new Thread(threadStart); 
    thread.Start(); 
} 

這裏的問題是,當多個請求發送到該控制器方法的線程會被殺掉。 我需要線程來保持工作,直到處理結束,並且它似乎是一個資源問題,獲得的資源越多,線程可以保持工作的線程越少。 如果我從Windows應用程序或服務運行該過程它完美地工作,它只有從Web應用程序啓動時遇到問題。

+0

如果一個對象......說'thread'超出範圍也可以是垃圾收集。我強烈建議使用'Task'來處理這樣的事情,因爲你不需要保留對它的引用。 – Mgetz

+0

我使用了Task,出於某種原因,任務經常比Thread更頻繁地取消,即使當我將任務歸爲(長時間運行)時也是如此。 – sino

+0

您是否試圖訪問該線程上的任何ASP.net上下文? – Mgetz

回答

5

理想情況下,你不應該創建的線程(長時間運行的後臺作業)關閉在IIS Web請求7.

的線程將被停止應應用程序池/ AppDomain重新啓動,這可能會發生的一些原因,例如作爲對bin文件夾內容的更改,更改爲web.config,一段不活動時間,達到資源閾值(例如內存使用情況)。事實上,AppDomain會在默認情況下定期重新啓動,因爲沒有其他原因,它會在x時間內保持活動狀態。

由於這個原因,長時間運行的任務應該使用作業隊列和後臺作業運行器來實現,例如,控制檯應用程序或Windows服務(重要的是,不在IIS的環境中運行),處理這些作業。

Web請求應該簡單地將作業添加到隊列中,以允許後臺作業運行器在作業出現時提取作業。

類似的問題已經在這裏找到答案Can I use threads to carry out long-running jobs on IIS?

編輯:一認真不推薦替代

如果硬要或者沒有辦法,只好在IIS進程中運行後臺作業,您需要看看允許後臺作業自動停止,並允許它在停止時從其停止的地方重新開始。

您可以有一個可以輪詢的URL來觸發未完成作業的重新啓動。

我以前見過這個工作,根據背景工作的需要,實現的複雜程度會有所不同。

您會發現服務器可能會開始出現性能問題,因爲後臺作業會反覆啓動並終止。

+0

當進程運行時由於計算CPU高達70% 。我的本地IIS上的 它永遠不會失敗我可以處理很多請求,這個過程只是變慢,但從不失敗。 在Cloud服務器中,線程在第二個或第三個線程後被殺死。 – sino

+0

最有可能發生的事情是雲服務器(azure/appharbor?),將在您使用太多CPU週期或內存時配置爲重新啓動AppDomain。這將確保服務質量到運行在硬件上的其他應用程序。 – danielfishr

+0

好點,這個問題的答案是另一個原因 – sino