使 ASP.NET MVC 方法在后台队列中工作
Make a ASP.NET MVC method do work in a background queue
主要问题:我想在后台执行一段代码。请进一步阅读以了解我所说的“背景”的意思。
我正在尝试通过 asynchronous/non-blocking 线程执行外部数据 posting。主要思想是提交表单的用户无需等待外部请求完成。
目前的流程是这样的:
- 用户提交带有数据的表单
- Action 处理数据执行内部步骤,如数据库更新、电子邮件通知等,还使用 外部资源 到 post 数据使用 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");
}
根据您编辑的场景和目标,以下 high-level 选项可能会帮助您实现目标。
- 您可以使用 Task.Run 为您的
PostDataToExternalResources
方法启动后台线程,但您仍然需要管理您这边的任何异常等。此外,如果您这样做,我不会将表单集合传递给该方法,请记住,您无法保证结果
- 您可以使用 HangFire 之类的东西将该进程变成后台作业,它有自己的耐久性等。我不会再次传递 FormCollection,但它可以有更好的耐久性。
因为查看“谢谢”页面似乎并不依赖于完成的任务,所以我会看一些像 HangFire 这样的东西 durable/executable 以确保一致性和易于管理
主要问题:我想在后台执行一段代码。请进一步阅读以了解我所说的“背景”的意思。
我正在尝试通过 asynchronous/non-blocking 线程执行外部数据 posting。主要思想是提交表单的用户无需等待外部请求完成。
目前的流程是这样的:
- 用户提交带有数据的表单
- Action 处理数据执行内部步骤,如数据库更新、电子邮件通知等,还使用 外部资源 到 post 数据使用 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");
}
根据您编辑的场景和目标,以下 high-level 选项可能会帮助您实现目标。
- 您可以使用 Task.Run 为您的
PostDataToExternalResources
方法启动后台线程,但您仍然需要管理您这边的任何异常等。此外,如果您这样做,我不会将表单集合传递给该方法,请记住,您无法保证结果 - 您可以使用 HangFire 之类的东西将该进程变成后台作业,它有自己的耐久性等。我不会再次传递 FormCollection,但它可以有更好的耐久性。
因为查看“谢谢”页面似乎并不依赖于完成的任务,所以我会看一些像 HangFire 这样的东西 durable/executable 以确保一致性和易于管理