使用Async Await返回View

我有一个我想在后台运行的流程。 只需单击操作链接即可执行此操作。

致电行动:

public async Task ProcessRec() { await Task.Run(() => waitTimer()); return RedirectToAction("Index", "Home"); } public void waitTimer() { Thread.Sleep(10000); } 

然而,在将我重定向到“Index,Home”动作之前,等待整整10秒。 我是Await / Async的新手,所以我知道我在这里解释错误。 当waitTimer在后台执行时,如何让应用程序返回此操作? 谢谢!!

await ,正如您所发现的那样,阻止响应在完成之前返回给用户。 通常你只是把你的后台工作放在另一个线程上并通过不等待将其设置为“fire and forget”,但是在ASP.NET中IIS将关闭未使用的AppDomains而Task.Run不通知IIS你的后台线程“正在使用AppDomain”,因此您的后台线程可以在AppDomain关闭期间使用Thread.Abort()终止。

如果您使用的是.NET 4.5.2或更高版本,您可以告诉IIS您有一个后台工作程序,您需要通过QueueBackgroundWorkItem保持活动QueueBackgroundWorkItem 。 你会像这样使用它

  public ActionResult ProcessRec() { HostingEnvironment.QueueBackgroundWorkItem(waitTimer); return RedirectToAction("Index", "Home"); } public void waitTimer(CancellationToken token) { Thread.Sleep(10000); } //You also could do public async Task waitTimer2(CancellationToken token) { await Task.Delay(10000); } 

现在,这并不能保证IIS不会关闭你的应用程序域,但它确实让它知道你正处于某种状态,并且会在尝试关闭它时要求更多的时间(在一次之后你需要多达90秒)默认情况下,启动shutdown以完成所有排队的后台项目)。

有关更多信息,请阅读此MSDN博客介绍它。

然而,在将我重定向到“Index,Home”动作之前,等待整整10秒。

是的,那是因为await异步等待操作完成。 它会将线程返回池,直到操作完成。

当waitTimer在后台执行时,如何让应用程序返回此操作?

Task.Run是危险的,因为它没有注册IIS的工作, 这可能导致问题 。 相反,您可以使用BackgroundTaskManager或HangFire来注册它与ASP.NET的执行:

 BackgroundTaskManager.Run(() => { waitTimer() }; return RedirectToAction("Index", "Home"); 

我正在考虑将消息发送到队列(如azure存储/服务总线队列),以便您可以立即获得响应。

然后创建另一个服务以使消息出列并处理(执行长时间运行的任务)

此外,如果这是一个azure网站(Web应用程序),您可以使用Web作业!

希望有所帮助。