可以/我应该在这里使用异步控制器吗?(ASP.NET MVC 3)

RPM*_*984 5 c# asp.net-mvc asynchronous asp.net-mvc-3

我有这个[HttpPost]动作方法:

[HttpPost]
public ActionResult AddReview(Review review)
{
   repository.Add(review);
   repository.Save();
   repository.UpdateSystemScoring(review.Id); // call SPROC with new Review ID.
   return View("Success", review);
}
Run Code Online (Sandbox Code Playgroud)

因此,基本上用户单击一个按钮,我将其添加到我的数据库(通过Entity Framework 4.0),保存更改,然后我使用标识字段调用存储过程,这是第二行代码.

这需要保存审阅之后完成(因为只有在调用Save时才创建标识字段,并且EF保留更改),这是系统范围的计算.

从用户的角度来看,他/她不会/不应该关心这种计算是否正在发生.

此过程可能需要0-20秒.它没有返回任何东西.

这是异步控制器的候选者吗?

有没有办法可以添加Review,让另一个异步控制器处理长时间运行的SPROC调用,这样用户可以立即进入Success页面?

我必须承认(对此部分感到羞耻):这是对现有系统的重写,在原始系统(ASP.NET Web Forms)中,我启动了另一个线程以实现上述任务 - 这就是为什么我是想知道相同的主体是否可以应用于ASP.NET MVC 3.

我总是尝试避免在ASP.NET中使用多线程,但用户体验是第一优先级,我不希望页面超时.

那么 - 这可能吗?也很高兴听到任何其他想法.另外 - 我不能在这里使用触发器,不是真的想详细说明为什么 - 但我不能.

Dar*_*rov 4

我会触发一个新线程(不是来自线程池)来执行此任务并立即返回,特别是如果您不关心结果的话。异步控制器在以下情况下非常有用:大部分时间都花在等待其他系统完成任务,并且一旦该系统完成任务,您的应用程序就会收到信号处理结果。在任务执行期间,应用程序不会消耗任何线程。因此,在您的场景中,此任务可以由 SQL Server 使用 ADO.NET 中 BeginRead 方法的异步版本来执行。如果您需要返回结果,可以使用它。如果你不触发一个新线程,它就会像以前一样工作得很好。