启动后台任务ASP.NET MVC 4.5

mob*_*tte 5 c# asp.net asp.net-mvc async-await asp.net-mvc-4

我在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");
}
Run Code Online (Sandbox Code Playgroud)

问题是在处理完成后正在显示"成功"视图.用户可以点击并执行其他操作,因为操作是异步的,但我想要创建后台进程,启动它并立即显示"成功"视图.用户不应该受到处理的困扰.

我怎样才能做到这一点?我已经尝试过后台工作者,但它没有工作(我收到错误,说那时异步进程无法启动).

Ste*_*ary 6

用户不应该在后台了解有关处理的任何信息.

你确定吗?如果在处理过程中出现错误怎么办?用户如何知道处理完成的时间?

我怎样才能做到这一点?

正如我在博客上解释的async那样,不会改变HTTP协议.

正确的解决方案是将上传的文件保存在某处(例如,Azure blob存储),将消息插入可靠的消息队列(例如,Azure队列存储),并具有完全独立的后端进行处理(例如,Azure工人角色).

如果你想要一个不正确的(内存中)解决方案,我会有另一篇博客文章描述这种方法.