启动后台任务ASP.NET MVC 4.5

问题描述 投票:5回答:2

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

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

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

c# asp.net asp.net-mvc asp.net-mvc-4 async-await
2个回答
6
投票

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

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

我怎样才能做到这一点?

正如我在我的博客上解释的那样,async does not change the HTTP protocol

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

如果你想要一个不正确的(内存中)解决方案,我有another blog post describing that approach


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");
© www.soinside.com 2019 - 2024. All rights reserved.