繁体   English   中英

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

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

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

我正在尝试通过异步/非阻塞线程执行外部数据发布。 主要思想是提交表单的用户不需要等待外部请求完成。

目前的流程是这样的:

  • 用户提交带有数据的表单
  • Action 处理数据执行内部步骤,如数据库更新、电子邮件通知等,还使用外部资源使用 API 发布数据
  • 用户被带到“感谢页面”

我正在尝试将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"); 
    }

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

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

由于查看“谢谢”页面似乎不依赖于任务的完成,我会查看像 HangFire 这样持久/可执行的东西,以保持一致性和易于管理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM