2010-01-09 26 views
0

我知道我們需要一個更好的解決方案,但我們現在需要以這種方式完成此項任務。當您點擊aspx網頁上的開始導入按鈕時,我們有一個很長的導入過程。這需要很長時間,有時幾個小時。我改變了超時時間,這很好,但大約一個小時後我仍然收到連接服務器重置錯誤。我在想這是asp.net的生命週期,我想知道是否有IIS中的設置,我可以改變這個生命週期。ASP.NET生命週期和漫長的過程

+0

http://stackoverflow.com/questions/118261/long-running-code-within-asp-net-process – 2010-05-04 01:55:26

回答

0

您可以嘗試在新線程中運行該進程。這意味着頁面將啓動任務,然後完成頁面的處理,但單獨的線程仍將在後臺運行。您不能夠獲得任何視覺反饋,因此您可能需要將進度記錄到數據庫並將其顯示在單獨的頁面中。

你也可以嘗試運行此作爲Ajax調用,而不是它有不同的限制回傳...

既然你認識到這是不是這樣做的方法我不會列出所有的可能性。我確定你知道他們是什麼:)

0

延長超時絕對不是這樣做的方式。響應時間應該保持在絕對最小值。如果可能的話,我會嘗試將這個長期運行的任務完全從ASP.NET應用程序中移出,並將其作爲一個單獨的進程運行。

之後,你要如何繼續下去。您可能希望進程將其結果轉儲到ASP應用程序可以輪詢的文件中,無論是通過AJAX還是讓用戶點擊F5。

0

如果它採取小時,我會建議一個單獨的線程來此,或許通過電子郵件發送通知時,它已準備好從服務器下載的結果(即發送一個鏈接到最終結果)

,或者如果它在客戶端的瀏覽器中有一個用戶界面非常重要(如果他們將要停留n個小時),那麼可以使用SetInterval從客戶端調用WebMethod(JavaScript)來定期檢查它是否完成。

+0

獨立線程是否也受到生命週期的影響,因爲我已將它放在單獨的線程中並且它仍然停留大約45分鐘。 – user204588 2010-01-10 05:59:34

+0

後臺線程不應該受到頁面生命週期的影響,但它可能會受到asp.net回收的影響(請參閱我的新帖子) – 2010-01-10 13:43:24

+0

初始頁面請求完成後,您的單獨線程將與任何請求斷開連接。當應用程序池回收或清理時,它會看到掛起的線程並終止它。 – ulty4life 2011-08-09 18:38:09

1

另外一個角度來考慮這或許可以解釋的行爲是ASPNET_WP.EXE回收,如果太多的內存被消耗如果你的漫長的過程佔用了(不與頁面生命週期相混淆)

內存太多ASP.NET將啓動一個新進程並重新分配所有現有的請求。我會建議檢查這個。您可以通過在aspnet_wp的任務管理器中查看並檢查正在使用的內存大小來做到這一點 - 如果大小已經回落,它已經回收了。

可以在machine.config中修改內存限制:

使用的memoryLimit指定允許的最大內存大小,系統內存總量的百分比工作進程,可以ASP.NET發佈之前消耗一個新的過程並重新分配現有的請求。 (默認爲60)

<system.web> 
    <processModel autoConfig="true" memoryLimit="10"/> 

如果這是什麼原因造成你的問題,唯一的解決辦法可能是爲你的長期運行一個單獨的進程。您將需要相應地設置IIS以允許其他EXE獲得相關權限。

3

你應該幾乎可以肯定地做一個單獨的過程中的長期工作(不只是一個單獨的線程)。

編寫一個獨立程序來執行導入。讓它在某個地方(例如數據庫中的一列)設置一個標誌,並將行放入日誌文件或數據庫表中以顯示進度。

這樣你的頁面才能開始工作。之後,它可以每隔幾分鐘自我刷新一次,直到「完成」標誌被設置。如果您想確定它仍在運行並且沒有死亡,您可以顯示日誌表。

這是非常簡單的東西,但如果您需要代碼示例,則可以提供它們。

+0

我會走得更遠,使它成爲一個NT服務。數據庫建議與Web服務器通信,沒問題,或者使用WCF。 – 2010-04-13 04:15:01

+0

如果這是一個很少運行的進程,並在完成時退出,我不確定服務的優勢是什麼。 – egrunin 2010-04-13 04:29:22