我有一個MVC4應用程序,我需要啓動一個長時間運行的進程。目前,此過程的代碼位於一個控制檯應用程序中,並作爲帶有頂架的服務進行安裝。我每隔幾秒就會檢查一次數據庫,看看它是否需要運行,但這不是一個解決方案。我需要一種方式讓MVC4應用程序啓動流程並忘記它,但是當響應返回給客戶端時,流程不會與Web應用程序一起卸載。如何調用可執行文件從MVC Web應用程序啓動服務
有人能指出我正確的方向嗎?
我有一個MVC4應用程序,我需要啓動一個長時間運行的進程。目前,此過程的代碼位於一個控制檯應用程序中,並作爲帶有頂架的服務進行安裝。我每隔幾秒就會檢查一次數據庫,看看它是否需要運行,但這不是一個解決方案。我需要一種方式讓MVC4應用程序啓動流程並忘記它,但是當響應返回給客戶端時,流程不會與Web應用程序一起卸載。如何調用可執行文件從MVC Web應用程序啓動服務
有人能指出我正確的方向嗎?
如果我理解你的問題,你可以做的是,在服務(這是一個從ServiceBase派生類),覆蓋OnCustomCommand:
private const int MY_CUSTOM_COMMAND = 140;
protected override void OnCustomCommand(int command)
{
if (command == MY_CUSTOM_COMMAND)
{
... Do stuff here ...
}
}
然後,您可以在您的業務觸發命令,從一些外部應用沿着這些線路:
private const int MY_CUSTOM_COMMAND = 140;
using (ServiceController sc = new ServiceController("MyTaskService", "ServiceMachine"))
{
sc.ExecuteCommand(MY_CUSTOM_COMMAND);
}
這就是基本思想。自定義命令可以是128-256之間的任何值。
我們在我們的網絡應用程序中使用了一個類似的系統,它允許用戶提交隨後由Windows服務運行的「作業」。 Web應用程序向Windows服務發送一條命令,讓它知道一個新的作業已經提交。該服務然後轉到數據庫以獲取有關要執行的作業的信息。
爲什麼輪詢數據庫不是解決方案? – David
如果我想及時將報告結果返回給客戶端,那麼我必須每秒都做一次(這是不必要的開銷和23.5小時內的數據庫訪問,它不會被使用),或者從外部初始化進程。我更喜歡每個進程運行不會觸及數據庫10,000次。 – Difinity