异步 ASP.Net MVC 控制器操作中的 Task.Run()

Bal*_*ala 4 c# asp.net asp.net-mvc multithreading

我需要您关于在 ASP.NET MVC 异步控制器操作中使用的建议Task.Run()。目前,我们有一个耗时的后端 SP,当用户单击“批准”时需要几分钟才能执行。用户只需要批准,不需要等到后端执行完成,所以我们Task.Run在这里使用,如下面的代码所示。

早些时候,这是由ThreadPool.QueueUserWorkItem()so 在后台完成的。现在,我们正在将此应用程序迁移到 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");    
}     
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

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

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

我在博客上描述了多种方法。唯一可靠的解决方案是将工作保存到持久存储并让独立的工作人员处理它。Hangfire 就是这样的解决方案之一。

但如果您愿意偶尔丢失工作,那么您可以使用 注册后台工作HostingEnvironment.QueueBackgroundWorkItem

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