Return to View with Async Await

后端 未结 4 1924
故里飘歌
故里飘歌 2020-12-18 06:23

I have a process I would like to run in the background. This is executed with a click of an action link.

Action to call:

   public async Task

        
4条回答
  •  佛祖请我去吃肉
    2020-12-18 07:02

    await, as you found out, blocks the response from returning to the user before it is done. Normally you would just put your background work on another thread and set it to "fire and forget" by not awaiting, however in ASP.NET IIS will shut down AppDomains that are not being used and Task.Run does not inform IIS that your background thread "is using the AppDomain" so your background thread could be terminated with a Thread.Abort() during an AppDomain shutdown.

    If you are using .NET 4.5.2 or newer you can tell IIS you have a background worker that you need to be kept alive via QueueBackgroundWorkItem. You would use it like this

       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);
       }
    

    Now this does not guarantee that IIS will not shut down your app domain but it does let it know you are in the middle of something and asks for more time when it does try to shut it down (You get up to 90 additional seconds after a shutdown is started to complete all queued background items by default).

    For more information read this MSDN blog introducing it.

提交回复
热议问题