2013-10-07 94 views
0

我有一個MVC4應用程序,我需要啓動一個長時間運行的進程。目前,此過程的代碼位於一個控制檯應用程序中,並作爲帶有頂架的服務進行安裝。我每隔幾秒就會檢查一次數據庫,看看它是否需要運行,但這不是一個解決方案。我需要一種方式讓MVC4應用程序啓動流程並忘記它,但是當響應返回給客戶端時,流程不會與Web應用程序一起卸載。如何調用可執行文件從MVC Web應用程序啓動服務

有人能指出我正確的方向嗎?

+1

爲什麼輪詢數據庫不是解決方案? – David

+0

如果我想及時將報告結果返回給客戶端,那麼我必須每秒都做一次(這是不必要的開銷和23.5小時內的數據庫訪問,它不會被使用),或者從外部初始化進程。我更喜歡每個進程運行不會觸及數據庫10,000次。 – Difinity

回答

1

如果我理解你的問題,你可以做的是,在服務(這是一個從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服務發送一條命令,讓它知道一個新的作業已經提交。該服務然後轉到數據庫以獲取有關要執行的作業的信息。

+0

抱歉沒有及時檢查。這幫助了很多。現在我遇到了服務器不允許安裝服務的問題。還有一個窗口問題需要處理8-S – Difinity

+0

@Difinity:如果需要按需執行一次流程,偶爾按計劃執行,那麼爲什麼不共享控制檯應用程序和Web應用程序之間的後端代碼?如果代碼被抽象到兩個應用程序共享的模塊中,那麼Web應用程序不需要調用服務,它只會將代碼作爲Web應用程序的一部分運行。 – David

相關問題