Task.Run()在异步ASP.Net MVC控制器动作中

时间:2016-04-18 05:46:24

标签: c# asp.net asp.net-mvc multithreading

我需要您在ASP.NET MVC异步控制器操作中使用Task.Run()的建议。我们目前有一个耗时的后端SP,当用户点击“批准”时需要几分钟才能执行。用户只需要批准,不必等到这个后端执行完成,所以我们在这里使用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");    
}     

1 个答案:

答案 0 :(得分:4)

  

我们对此进行了测试,并且一切正常,但我们需要确保将来是否会产生任何问题。

是的,它肯定会导致问题,因为ASP.NET不了解您的后台工作。

我在博客上描述了variety of approaches。唯一的可靠解决方案是将工作保存到持久存储,并让独立的工作人员对其进行处理。 Hangfire就是这样一种解决方案。

但是,如果您偶尔失去工作,那么您可以使用HostingEnvironment.QueueBackgroundWorkItem注册后台工作。

在任何情况下,您都不应使用Task.RunThreadPool.QueueUserWorkItem来开展后台工作。

相关问题