0

客戶希望有一個按鈕,從數以百計的記錄的外部源火了一個數據庫更新一個asp.net頁面。這個過程需要很長時間。他還希望在進程運行時進行狀態更新,如「處理1000條記錄中的10條」。在閱讀各種文章時,我正在考慮將數據庫更新代碼放入Windows服務中。我從來沒有使用過Windows服務,我找不到許多關於如何從一個asp.net頁面啓動一個windows服務並進行輪詢的教程。我的問題是這是處理這個過程的最好方法嗎?而且,有沒有人有他們如何完成這個任務的例子?如何斷火和輪詢從asp.net頁面窗口服務

+0

您可以使用Web服務來代替Windows服務。我已經完成並在此處發佈了博客:http://weblogs.asp。net/stevewellens/archive/2009/04/05/using-session-state-in-a-web-service.aspx –

回答

4

有接近這幾方面。

你說得對在執行網絡的工作進程中的長時間運行的任務通常不會有好下場:它佔用了資源,應用程序池可以得到回收,等等。在我的大部分任何複雜的項目,我通常最終得到4個部分:數據庫,我的模型的DLL,Windows服務的「工作人員」和ASP.NET網站。

的「工人」是一個Windows服務是始終運行,並使用Quartz.net執行使用該網站使用相同型號的計劃任務。這些可都是似乎突然出現維護任何一個複雜的網站時,各種各樣的週期性任務:VacuumExpiredPickTicketsJobBackupAndFtpDatabaseJobSendBackorderReminderEmailsJob

編寫Windows服務在C#中並不難(有一個內置的Visual Studio中的模板,但你幾乎繼承了ServiceBase,並且你已經參加了比賽),而像TopShelf這樣的庫使它更容易部署。

而剩下的就是觸發從網站更新並將結果傳送回給用戶。這可以像你希望的那樣簡單或複雜。如果這種情況必須擴展到大量用戶,則可以使用類似MSMQ的內容將更新命令排隊到Windows服務,並且Windows服務將響應該隊列。我覺得這可能是過度殺傷的印象。

對於少數用戶,你可以重寫你的服務的OnCustomCommand(int command)方法是觸發。然後,您的網站將使用ServiceController類的ExecuteCommand()來啓動該過程。你的網站和服務會同意這個參數值,意思是「做更新的事情」,比如說142(因爲歷史原因它必須是128到255之間的數字)。

至於將進度反饋給客戶端,最簡單的方法是讓Web頁面使用計時器和AJAX調用來輪詢更新的進度數據。您可以使用像WebSockets(我寫這篇文章時會出現的最新的內容)和long polling這樣的新內容,但是定期投票只會用於某些不需要擴展的內容。

希望這會有所幫助!

+0

你是對的,MSMQ是矯枉過正和定期輪詢很好,但...你怎麼做從asp.net頁面的Windows服務定期輪詢?我知道如何使用ajax和一個定時器控件,但是我怎樣在windows服務上調用以獲取狀態? – user204588

+0

我曾經想過DB方法,我只是想知道如果每次產品打900次DB會是瓶頸。 – user204588

1

除了Nicholas的全面回答之外,另一個選擇是將後端進程作爲命令行腳本部署,並安排它們通過Window內置的任務調度程序運行,該調度程序在Windows Server 2008+中已經有所改進。或者您可以使用任何其他主機的任務調度程序應用程序。

我發現命令行方法更容易讓MIS員工瞭解和配置,並遷移到新的服務器,而不是標準的Windows服務。