我必須啓動線程才能在後臺執行一些長時間運行的任務(即使瀏覽器已關閉),而無需等待網頁按鈕單擊事件的響應。從ASP.NET啓動和停止線程
如果用戶希望這樣做,我還需要能夠稍後停止。
我該怎麼做?
是否可以將線程的id
存儲在數據庫中,並在稍後中止?
我需要使異步webservice
或wcf
調用來實現嗎?
如果在這種情況下需要的話,我該如何停止長時間運行的任務?
在此先感謝。
我必須啓動線程才能在後臺執行一些長時間運行的任務(即使瀏覽器已關閉),而無需等待網頁按鈕單擊事件的響應。從ASP.NET啓動和停止線程
如果用戶希望這樣做,我還需要能夠稍後停止。
我該怎麼做?
是否可以將線程的id
存儲在數據庫中,並在稍後中止?
我需要使異步webservice
或wcf
調用來實現嗎?
如果在這種情況下需要的話,我該如何停止長時間運行的任務?
在此先感謝。
我建議你的ASP.Net應用程序向數據庫表寫請求,並用Windows服務處理這些請求。
我會用一個表排隊新任務和一個單獨的表來管理運行任務。這第二個表可用於報告進度或終止正在運行的任務。完成任務後,您可以將它們移至第三個表格,並附有彙總數據以供日後分析。
該數據庫還爲您提供了持久性,因此如果服務器崩潰,Windows服務可以提供任務的自動重新啓動,而無需用戶重新提交它們。
如果你有很多排隊的任務,你可以在多個應用程序服務器上產生Windows服務來加快速度,所有這些都是通過數據庫控制的。
可以使用backgroundworker類:
實例化一個BackgroundWorker,定義一個DoWork的事件處理程序和RunWorkerCompleted事件處理程序。然後使用RunWorkerAsync方法啓動該操作。您可以使用CancelAsync方法取消操作。
也許您可以在緩存或應用程序中存儲對工作人員的引用(或者在Session中,如果它是用戶特定的),以便在需要取消時檢索它。
這就是我幾乎決定的,因爲涉及各種問題(如負載平衡器等)管理Web服務器上的長時間運行的任務。 Windows服務可以啓動多個線程並行執行任務。 Windows服務的唯一問題是它需要每隔一秒鐘或幾分鐘檢查一次數據庫以檢查新的請求,這在非高峯時間效率不高,如果以某種方式事件驅動,比如事件是在用戶發出請求並且服務訂閱它時發佈的,並且只在有新請求時才發揮作用。我需要使用MSMQ嗎? – RKP 2010-10-15 09:16:48
你可以嘗試MSMQEvent,看看它是否適合你。投票不應該給服務器帶來很大的負擔,除非你經常敲打它。如果這是個大問題,你可以在非高峯時段的時間間隔後退。但是機器的目的是做事情,所以如果它沒有做其他事情,那麼一些投票會出現什麼問題? – 2010-10-15 13:30:20
感謝您的回覆 – RKP 2010-10-15 15:11:24