我需要您在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");
}
答案 0 :(得分:4)
我们对此进行了测试,并且一切正常,但我们需要确保将来是否会产生任何问题。
是的,它肯定会导致问题,因为ASP.NET不了解您的后台工作。
我在博客上描述了variety of approaches。唯一的可靠解决方案是将工作保存到持久存储,并让独立的工作人员对其进行处理。 Hangfire就是这样一种解决方案。
但是,如果您偶尔失去工作,那么您可以使用HostingEnvironment.QueueBackgroundWorkItem
注册后台工作。
在任何情况下,您都不应使用Task.Run
或ThreadPool.QueueUserWorkItem
来开展后台工作。