使 ASP.NET MVC 方法在后台队列中工作

Make a ASP.NET MVC method do work in a background queue

主要问题:我想在后台执行一段代码。请进一步阅读以了解我所说的“背景”的意思。

我正在尝试通过 asynchronous/non-blocking 线程执行外部数据 posting。主要思想是提交表单的用户无需等待外部请求完成。

目前的流程是这样的:

我正在尝试将 UploadFilesToAmazonAWSAndDropBoxAndFlickrAndGoogleDrive 与常规用户流程分离,因为在当前设置中,用户正在等待外部 API 完成。如何在后台线程中制作UploadFilesToAmazonAWSAndDropBoxAndFlickrAndGoogleDrive运行?

编辑:发布我要修复的代码的粗略概要

    [HttpPost]
    public ActionResult Index(FormCollection fc)
    {
        //database operations, 
        InsertIntoDatabase(fc); //takes 1 second

        //3rd party posting
        //Takes about 30 seconds. 
       //Why it takes 30 seconds is obvious. Please let me know if this isn't obvious. 
        UploadFilesToAmazonAWSAndDropBoxAndFlickrAndGoogleDrive(fc); 

        //email operations
        SendEmails(fc); //takes 1 second

        //User is taken to Thank you page after 32 seconds. I want to reduce the time to 2 seconds
        return View("ThankYou"); 
    }

根据您编辑的场景和目标,以下 high-level 选项可能会帮助您实现目标。

  • 您可以使用 Task.Run 为您的 PostDataToExternalResources 方法启动后台线程,但您仍然需要管理您这边的任何异常等。此外,如果您这样做,我不会将表单集合传递给该方法,请记住,您无法保证结果
  • 您可以使用 HangFire 之类的东西将该进程变成后台作业,它有自己的耐久性等。我不会再次传递 FormCollection,但它可以有更好的耐久性。

因为查看“谢谢”页面似乎并不依赖于完成的任务,所以我会看一些像 HangFire 这样的东西 durable/executable 以确保一致性和易于管理