【问题标题】:Make a ASP.NET MVC method do work in a background queue使 ASP.NET MVC 方法在后台队列中工作
【发布时间】:2021-01-30 13:28:57
【问题描述】:

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

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

目前的流程是这样的:

  • 用户提交带有数据的表单
  • 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。更长的答案是像下面说的@MitchellSellers 做一些事情(或者最好发布到队列并让Web 应用程序之外的应用程序处理队列),并且还要考虑什么以及如何管理异常(例如数据库已关闭,SQS已关闭)、失败的电子邮件、重试、补偿交易等。这是一个非常广泛的话题。
  • @mjwills,管理异常、重放失败的请求以及所有可能出错的事情超出了我所问的范围。我要求一种简单的方法来执行常规程序流之外的代码块——最终目标是提高应用程序的响应能力。我认为这对于 Web 开发人员来说是一个非常常见的场景。
  • 使您的索引方法异步将允许您的线程在等待 I/O 时处理其他请求。但是浏览器上的最终用户仍会等待您完成。除非您将工作移至后台作业队列。
  • 恕我直言,插入数据库,然后查询数据库以驱动您的作业队列。主要是为了让您可以重试上传/发送电子邮件。
  • I asked for a simple way to execute a block of code outside the regular program flow 也许再读一遍我的medium answer。 ;)

标签: c# asp.net-mvc asynchronous asp.net-mvc-4 asp.net-mvc-3


【解决方案1】:

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

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

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

【讨论】:

  • 您能否编辑问题以澄清您在这里回答的内容? IE。您是在谈论客户端(WinForms/WPF/UWP)还是服务器(ASP.Net MVC / WebAPI)场景?
  • 我说的是 ASP.NET
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多