如何解决使ASP.NET MVC方法在后台队列中工作
主要问题:我想在后台执行一段代码。请进一步阅读以了解我所说的“背景”。
我正在尝试通过异步/非阻塞线程执行外部数据发布。主要思想是提交表单的用户无需等待外部请求完成。
当前流程如下:
- 用户提交包含数据的表格
- 操作过程中,数据执行内部步骤,例如数据库更新,电子邮件通知等,并且还使用外部资源使用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),以实现一致性和易于管理性
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。