我在ASP.NET MVC中实现了一个简单的pdf上传器,我需要处理上传的文档。因为处理可能需要一段时间,我希望这可以在后台完成。 工作流程是这样的: 我希望用户上传文档,当文档保存在数据库中时,他应该能够在网站上做其他事情,包括上传新文档。用户不应该在后台了解有关处理的任何信息。
我的实现看起来像这样:
[HttpPost]
public async virtual Task<ActionResult> Confirm(string author, string title)
{
//...
previousDocumentIsProcessing = true;
await InvokeDocumentProcessor(_document.Path, _document.DocumentID);
previousDocumentIsProcessing = false;
return View("Success");
}
问题是处理完成后会显示“成功”视图。用户可以点击并执行其他操作,因为操作是异步的,但我想要创建后台进程,启动它并立即显示“成功”视图。用户不应该受到处理的困扰。
我怎样才能做到这一点? 我已经尝试过后台工作者,但它没有工作(我收到错误,说那时异步进程无法启动)。
答案 0 :(得分:6)
你确定吗?如果在处理过程中出现错误怎么办?用户如何知道处理何时完成?用户不应该在后台了解有关处理的任何信息。
我怎样才能做到这一点?
我在博客上解释async
does not change the HTTP protocol。
正确的解决方案是将上传的文件保存在某处(例如,Azure blob存储),将消息插入可靠的消息队列(例如,Azure队列存储),并具有完全独立的后端进行处理(例如,Azure工作者角色。)
如果你想要一个不正确的(内存中)解决方案,我有another blog post describing that approach。
答案 1 :(得分:0)
这个解决方案怎么样? http://brian-federici.com/blog/2013/7/8/ensuring-tasks-complete-in-aspnet-mvc
[HttpPost]
public ActionResult Vote(long id, VoteDirection vote)
{
IISTaskManager.Run(() =>
{
...
}
);
return View("Success");