使用Async Await返回View

Nor*_*ley 5 c# asp.net asynchronous task-parallel-library async-await

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

致电行动:

   public async Task<ActionResult> ProcessRec()
   {
        await Task.Run(() => waitTimer());
        return RedirectToAction("Index", "Home");
   }

   public void waitTimer()
   {
        Thread.Sleep(10000);
   }
Run Code Online (Sandbox Code Playgroud)

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

Sco*_*ain 5

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

如果您使用的是.NET 4.5.2或更高版本,则可以告诉IIS您有一个后台工作程序需要通过它保持活动状态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);
   }
Run Code Online (Sandbox Code Playgroud)

现在,这并不能保证IIS不会关闭你的应用程序域,但它确实让它知道你正处于中间状态并要求更多时间尝试将其关闭(你需要花费更多的时间来追加90秒)默认情况下,启动shutdown以完成所有排队的后台项目).

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