2016-04-18 105 views
2

我需要你在ASP.NET MVC異步控制器操作使用Task.Run()建議。我們目前有一個耗時的後端SP,當用戶單擊「批准」時,需要幾分鐘的時間才能執行。用戶只需要批准,不必等到後端執行完成,因此我們在此處使用Task.Run,如下面的代碼所示。Task.Run()在異步ASP.Net MVC控制器行動

早些時候,使其在後臺完成這是由ThreadPool.QueueUserWorkItem()完成。現在,我們正在將此應用程序遷移到ASP.Net MVC 5.0。

我們測試了這一點,它的所有工作正常,但我們需要知道這將不會造成未來的任何問題。請指教。

public async Task<ActionResult> ApprovePayments(int Id) 
{ 
await (db.PaymentApprove(Id, User == null ? "" : User.Identity.Name)); 
Task.Run(() => { 
        DBModel dbReport = new DBModel(); 
        dbReport.PaymentReportCreate(Id); 
        dbReport.Dispose(); 
       }); 
SetUnapprovedPaymentsViewBag(); 
    return View("PendingPayments");  
}  
+2

Scott Hanselman幾年前做了一個綜述:[如何在ASP.NET中運行後臺任務](http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx) –

回答

3

我們測試了這一點,它的所有工作正常,但我們需要知道這將不會造成未來的任何問題。

是的,它肯定會導致問題,因爲ASP.NET不知道您的後臺工作。

我描述了我的博客上一個variety of approaches。唯一的可靠的解決方案是將工作保存到持久性存儲,並有一個獨立的工作人員處理它。 Hangfire就是這樣一種解決方案。

但如果你確定與偶爾失去工作,那麼你可以用HostingEnvironment.QueueBackgroundWorkItem登記工作背景。

在任何情況下,你應該使用Task.RunThreadPool.QueueUserWorkItem揭開序幕後臺工作。

+0

謝謝Stephen。在過去的5年中,舊的應用程序與ThreadPool.QueueUserWorkItem一起工作正常,沒有任何問題。所以,我們決定現在用Task.Run()替換它。整個後臺工作完全由SP完成,所以當SP啓動時,它應該運行併成功完成,但ASP.Net工作進程可能會停止。如果我錯了,請糾正我。 – Bala

+0

@Bala:我不知道你的意思是「SP」。如果這是一個獨立的過程,那麼這種方法可能是可靠的。 –

+0

對不起,我應該已經更具體,其存儲過程.. – Bala