2008-09-16 92 views
0

在我的Web應用程序中,有一個過程從整個Web查詢數據,對其進行過濾,並將其保存到數據庫。你可以想象這個過程需要一些時間。我目前的解決方案是增加頁面超時時間,並在加載時爲用戶提供AJAX進度條。這是一個問題,有兩個原因 - 1)它需要很長時間,用戶必須等待2)它有時仍然超時。在ASP.Net應用程序中處理長時間運行的進程的最佳方式是什麼?

我已經涉足線程化過程,並且已經閱讀我應該異步發佈到Web服務(「Fire and forget」)。

一些參考我讀過:
- MSDN
- Fire and Forget

所以我的問題是 - 什麼是最好的方法是什麼?

更新:在用戶輸入他們的數據後,我想將它們重定向到結果頁面,該頁面隨着進程在後臺運行而逐漸更新。

回答

7

爲了避免過多的建築天文學,我經常use a hidden iframe to call the long running process and stream back progress information。加上類似jsProgressBarHandler的東西,您可以非常輕鬆地創建出色的帶外進度指示,用於通用進度動畫不會削減的較長任務。

在您的具體情況中,您可能希望使用一個LongRunningProcess.aspx每個任務調用來避免這些頁面超時。

例如,調用LongRunningProcess.aspx?的TaskID = 1到啓動它,然後在該任務結束,發出

document.location = "LongRunningProcess.aspx?taskID=2". 

廣告nauseum。

1

我在上一份工作中遇到了這個確切的問題。我發現的最好方法是啓動一個異步過程,並在完成後通知用戶(電子郵件或其他)。讓他們等待很長時間會因爲超時而浪費生產力。讓他們等待進度條可能會給他們錯誤的安全感,他們可以在關閉瀏覽器時取消該過程,而這可能並非如此,具體取決於您如何設置系統。

+0

你用什麼方法? 「火與忘」?您是否構建了一個Web服務並使用[SoapDocumentMethod(OneWay = true)]屬性來裝飾該方法? – 2008-09-16 14:46:03

0
  1. 您如何查詢遠程數據?
  2. 它多久改變一次?
  3. 結果是否可以緩存一段時間?
  4. 我們這裏實際談論的時間有多長?

的「最佳方法」可能取決於在對這些問題的答案某種方式......

+0

1.大部分數據通過XMLHTTP請求獲取RSS feds/Web服務 2.我有一個每五分鐘運行一次的過程來更新數據庫。問題出在用戶第一次創建他們的查詢時,他們必須等待。 – 2008-09-16 14:50:48

+0

3.是的,他們可以緩存 - 但這不會幫助問題出在哪裏(當用戶創建查詢時) 4.根據他們的輸入可能是30秒到幾分鐘 – 2008-09-16 14:51:28

2

我們也有類似的問題,並通過經臺異步Web服務調用開始工作解決它(這意味着用戶不必等待工作完成)。然後,Web服務啓動一個執行該工作的SQL作業,並定期更新一個包含工作狀態的表。我們提供了一個允許用戶查詢表的UI。

0

您可以創建另一個線程並在會話或應用程序狀態中存儲對線程的引用,具體取決於線程每個網站只能運行一次,還是每個用戶會話一次。
然後,您可以將用戶重定向到可監視線程進度的頁面。您可以將頁面設置爲自動刷新,或者向用戶顯示刷新按鈕。
完成線程後,您可以發送電子郵件給用戶。

+0

那麼線程如何獲得關閉?你怎麼知道線程何時完成?你有代碼示例嗎? – 2008-09-16 14:56:21

0

我的解決方案是使用帶外服務來執行這些操作並將它們緩存在db中。

當人第一次要求什麼時,他們會稍微等待,然後顯示出來,但是如果他們刷新,立即,然後,因爲它的int db,它現在是小時的一部分從上次請求更新下一個24小時。

+0

我喜歡這個解決方案。 「帶外服務」是什麼意思? 我想發佈這個到web服務,並重定向到結果頁,它將在運行過程中增量更新 – 2008-09-16 14:57:26

0

將作業及其相關參數添加到作業隊列表中。然後,編寫一個windows服務,它將提取這些作業並處理它們,將結果保存到適當的位置,並通過電子郵件發送請求者鏈接到結果。給用戶提供某種用戶界面也是一種很好的方式,用戶可以檢查他們的工作狀態。

這種方式比啓動單獨的線程或增加超時要好得多,特別是當應用程序較大並且需要擴展時,您可以根據需要添加多個服務器來處理作業。

相關問題