【发布时间】: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