2012-10-23 34 views
7

.net 4.5,asp.net mvc:什麼是從ASP.NET應用程序運行持久過程(1-2分鐘)的最好方法,因爲它應該在單線程環境中運行,我的意思是這個過程是隻對一個用戶發起一次,所有其他用戶的執行必須等到當前執行完成?該方案如下:用戶單擊運行某種持久計算的按鈕,http響應立即返回給用戶,然後用戶必須手動請求單獨請求的計算狀態。 Asp.net http會話流產不應該導致流程終止,它應該繼續下去。該進程可能運行在同一個服務器或單獨的服務器上。如何在asp.net下異步運行持久進程?

+0

您可以在計算機上添加服務嗎? – Patrick

+0

我可以,但我想知道如何爲每個Web應用程序線程提供連續執行? – YMC

回答

3

我建議使用諸如NServiceBus之類的產品來卸載處理並以單線程模式運行。這樣做的好處是,所有請求都將按順序處理,並且可以從Web服務器卸載處理,因爲您並不真正想要在Web服務器上發生長時間運行的進程。

+0

我們其實正在考慮這個選項。有像你提到的優點,但也有不利因素,如必要的基礎設施設置:MSMQ,消息隊列創建,單獨配置 – YMC

+0

NServiceBus將爲您處理大量問題(安裝和配置MSMQ和DTC),它旨在解決你提到的問題。 –

+0

我喜歡NSBus,這可能對我們來說是最好的解決方案,但我的意思是這樣的解決方案會帶來一些額外的管理成本,如下所示:1)MSMQ,RavenDb以及其他需要安裝的東西,我記得我們必須單獨下載和設置它們,它們不是NSBus包的一部分,2)有人需要定期檢查失敗的消息隊列,除了我們的常規日誌文件(兩個應用程序跟蹤點而不是一個)3)單獨的過程意味着它假設有自己的配置(兩個配置文件來管理,而不是一個) – YMC

12

我會告訴你如何與http://hangfire.io執行此任務 - 執行ASP.NET應用程序內發射後不管,延遲,重複任務非常容易的方式。不需要Windows服務。

首先,通過NuGet安裝包。如果您有任何問題,請參閱官方文檔中的Quick Start指南。

PM> Install-Package Hangfire 

打開OWIN啓動類,並添加以下行:

public void Configure(IAppBuilder app) 
{ 
    GlobalConfiguration.Configuration.UseSqlServerStorage("connection_string"); 

    app.UseHangfireDashboard(); 
    app.UseHangfireServer(); 
} 

然後寫,將做長期運行的工作方法(我加屬性在同一時間只能執行一個方法) :

[DisableConcurrentExecution] 
public void LongRunning() 
{ 
    // Some processing stuff 
} 

然後調用一個方法背景發射後不管到立即響應用戶:

public ActionResult Perform() 
{ 
    BackgroundJob.Enqueue(() => LongRunning()); 
    return View(); 
} 

如果要通知用戶關於作業完成的信息,請考慮使用SignalR並相應地追加LongRunning方法。

+0

偉大的解決方案。感謝您的框架。 – scottheckel