2009-11-30 26 views
1

我們有一個ASP.Net應用程序,它提供管理員處理大型記錄集並對其執行操作。例如,我們有一個「波蘭數據」任務,管理員可以執行該任務來清理記錄數據(例如,重新格式化電話號碼,社會安全號碼等)。在少量記錄上執行任務時,任務可以相對快速完成。但是,當用戶在更大的一組記錄上執行任務時,任務可能需要幾分鐘或更長時間才能完成。所以,我們想用某種異步模式來實現這些類型的任務。例如,我們希望能夠啓動任務,然後使用AJAX輪詢來提供進度條和狀態信息。BackgroundWorker來自ASP.Net應用程序

我一直在研究使用BackgroundWorker類,但我已經在線閱讀了一些讓我暫停的東西。我很想得到一些額外的建議。

例如,我明白BackgroundWorker實際上會使用當前應用程序中的線程池。就我而言,該應用程序是一個ASP.Net網站。我已經讀過這可能是一個問題,因爲當應用程序回收時,後臺工作人員將被終止。上面提到的一些工作可能需要3分鐘,但其他工作可能需要幾個小時。

此外,我們可能會有幾百名管理員在白天執行類似的操作。 ASP.Net應用程序線程池是否能夠有效地處理所有這些後臺作業,同時仍然執行正常的請求處理?

所以,我想確定使用BackgroundWorker類和方法是否適合我們的需求。我應該看看另一種方法嗎?

感謝和抱歉這麼長的帖子!

Kevin

回答

1

在你的情況下,它實際上聽起來像你要尋找的解決方案是多方面的(而不是一個簡單的並完成項目)。

既然你說過一些進程可以持續幾個小時,絕對不是ASP.NET擁有的。這應該在Windows服務中運行,並使用本地Windows線程進行管理。

您需要在服務中實現某種類型的工作隊列以及與隊列進行通信的方式。一種方法是公開一個WCF服務來處理你的服務管理的所有操作。另一種方法是通過服務輪詢數據庫表並從表中提取工作。

爲了能夠表示進程的狀態,您希望ASP.NET應用程序能夠對processID有一些引用,例如WCF服務返回一個guid標識符。然後你有一個方法,當你給它一個processID時,它會返回進程的狀態。然後,您可以使用AJAX實施該服務調用的輪詢,並顯示您希望的任何類型的模式。

另一件需要記住的事情是,您需要設計流程以瞭解它的位置和結束位置,以便它可以跟蹤它所處的狀態。例如,BatchJobA已運行並且將具有1000條記錄進行處理。該服務需要知道它在哪些記錄上,或者當前的比例是多少,因爲它能夠將信息返回給用戶界面。對於需要很長時間才能執行的sql查詢,要準確判斷它的位置是非常有問題的,除非您對臨時表進行了大量預處理和後處理,您可以在其中讀取臨時表的狀態瞭解它在哪裏。

0

你可能會考慮一個稍微不同的方法。

例如,有一個命令和控制表,您可以在其中發送諸如「REFORMAT PHONE NUMBERS」等命令。

然後有一個Windows服務監控該表。每當有記錄出現時,運行該命令。

這消除了後臺線程的任何擔心。此外,您對隊列中的內容,包括優先級等操作的順序有更多靈活性。最後,您將獲得正在運行或需要運行的最終清單。

作爲一個選項,您可以使用SQL作業而不是windows服務來每隔一段時間執行一次,以觀察控制表並執行請求的操作。

1

根據你在說什麼我認爲BackgroundWorker不是一個好的選擇。

此外,將此功能作爲主應用程序的一部分可能會有問題,特別是因爲如果主應用程序回收,您不希望提交的處理被中斷。你可以玩異步處理,但它仍然是AppDomain的主應用程序的一部分 - 如果應用程序回收,它將全部死亡。

我會建議建立一個單獨的應用程序來實現這個功能。在類似的情況下,我將後臺處理分離到Windows服務並作爲通信手段託管在其中的Web服務