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

C# 异步ASP.Net MVC控制器操作中的Task.Run(),c#,asp.net,asp.net-mvc,multithreading,C#,Asp.net,Asp.net Mvc,Multithreading,我需要您提供有关在ASP.NET MVC异步控制器操作中使用Task.Run()的建议。我们目前有一个耗时的后端SP,当用户单击“批准”时,它需要几分钟的时间来执行。用户只需批准,无需等待此后端执行完成,因此我们使用任务。在此处运行,如下面的代码所示 之前,这是由ThreadPool.QueueUserWorkItem()完成的,因此它是在后台完成的。现在,我们正在将此应用程序迁移到ASP.Net MVC 5.0 我们对此进行了测试,一切正常,但我们需要确保这在未来不会产生任何问题。请告知 pu

我需要您提供有关在ASP.NET MVC异步控制器操作中使用
Task.Run()
的建议。我们目前有一个耗时的后端SP,当用户单击“批准”时,它需要几分钟的时间来执行。用户只需批准,无需等待此后端执行完成,因此我们使用
任务。在此处运行
,如下面的代码所示

之前,这是由
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");    
}     
public异步任务批准付款(int-Id)
{
wait(db.PaymentApprove(Id,User==null?”:User.Identity.Name));
Task.Run(()=>{
DBModel dbReport=新的DBModel();
dbReport.PaymentReportCreate(Id);
dbReport.Dispose();
});
设置UnapprovedPaymentsViewBag();
返回视图(“待付款”);
}     
我们对此进行了测试,一切正常,但我们需要确保这在未来不会产生任何问题

是的,它肯定会引起问题,因为ASP.NET不知道您的背景工作

我在我的博客上写了一篇文章。唯一可靠的解决方案是将工作保存到持久性存储中,并由独立的工作人员处理。Hangfire就是这样一个解决方案

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


在任何情况下都不应使用
Task.Run
ThreadPool.QueueUserWorkItem
启动后台工作。

Scott Hanselman几年前做了一个总结:谢谢Stephen。旧应用程序在ThreadPool.QueueUserWorkItem上运行良好,在过去5年中没有出现任何问题。因此,我们决定现在用Task.Run()替换它。整个后台工作完全由SP完成,因此当SP启动时,它应该运行并成功完成,尽管ASP.Net工作进程可能会停止。如果我错了,请纠正我。@Bala:我不知道你说的“SP”是什么意思。如果这是一个单独的过程,那么这种方法可能是可靠的。@Bala:在这种情况下,它应该会起作用。请注意,您无法让您的web应用知道SP是否出现故障。是的。谢谢你,斯蒂芬。