启动后台任务ASP.NET MVC 4.5

时间:2014-01-11 12:55:25

标签: c# asp.net asp.net-mvc asp.net-mvc-4 async-await

我在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");
}

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

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

2 个答案:

答案 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");