2016-04-18 10 views
2

ASP.NET MVC非同期コントローラアクションでTask.Run()を使用することについてアドバイスが必要です。現在、「承認」をクリックすると実行に時間がかかるバックエンドSPがあります。ユーザーは、承認する必要があり、このバックエンドの実行が完了するまで待つ必要はないので、ここではTask.Runを使用しています(下のコードを参照)。非同期ASP.Net MVCコントローラのアクションでTask.Run()を実行

以前これは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はそのような解決策の1つです。

しかし、時折仕事が失われても問題ない場合は、HostingEnvironment.QueueBackgroundWorkItemで背景作業を登録できます。

バックグラウンド作業を開始するのに、Task.RunまたはThreadPool.QueueUserWorkItemを使用しないでください。

+0

Stephenに感謝します。古いアプリケーションは、過去5年間は何の問題もなく、ThreadPool.QueueUserWorkItemで正常に動作していました。そこで、Task.Run()に置き換えることにしました。バックグラウンド作業のすべてはSPによって完全に行われるため、SPが開始されると、ASP.Netワーカープロセスが停止する可能性がありますが、SPを実行して正常に完了する必要があります。私が間違っているなら、私を修正してください。 – Bala

+0

@Bala: "SP"の意味が分かりません。これが別のプロセスである場合、そのアプローチは信頼できるものです。 –

+0

申し訳ありませんが、より具体的な、そのストアドプロシージャ.. – Bala