Starting a background task ASP.NET MVC 4.5
我在ASP.NET MVC中实现了一个简单的pdf上传器,我需要处理上传的文档。由于处理可能需要一段时间,因此我希望在后台完成此操作。
工作流程是这样的:
我希望用户上传文档,并且当文档保存在数据库中时,他应该能够在网站上执行其他操作,包括上传新文档。用户不应对后台的处理一无所知。
我的实现看起来像这样:
1 2 3 4 5 6 7 8 9 10 | [HttpPost] public async virtual Task<ActionResult> Confirm(string author, string title) { //... previousDocumentIsProcessing = true; await InvokeDocumentProcessor(_document.Path, _document.DocumentID); previousDocumentIsProcessing = false; return View("Success"); } |
问题是在完成处理后,正在显示"成功"视图。由于该操作是异步的,因此用户可以单击周围并执行其他操作,但是我要创建一个后台进程,然后启动它并立即显示"成功"视图。用户不应被处理打扰。
我该如何实现?
我已经尝试过使用后台工作程序,但是它没有用(我收到错误消息,指出此时无法启动异步进程)。
User should not know anything about the processing in the background.
你确定吗? 如果处理期间出现错误怎么办? 用户如何知道何时完成处理?
How can I achieve this?
正如我在博客上所解释的,
正确的解决方案是将上载的文件保存在某个位置(例如,Azure Blob存储),将消息插入可靠的消息队列(例如,Azure队列存储),并具有一个完全独立的后端来进行处理(例如,Azure) 工人角色)。
如果您想要一个不合适的(内存中的)解决方案,我还有另一篇博客文章描述了这种方法。
那这个解决方案呢
http://brian-federici.com/blog/2013/7/8/ensuring-tasks-complete-in-aspnet-mvc
1 2 3 4 5 6 7 8 9 10 11 | [HttpPost] public ActionResult Vote(long id, VoteDirection vote) { IISTaskManager.Run(() => { ... } ); return View("Success"); |