C# 启动后台任务ASP.NET MVC 4.5

C# 启动后台任务ASP.NET MVC 4.5,c#,asp.net,asp.net-mvc,asp.net-mvc-4,async-await,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Async Await,我在ASP.NETMVC中实现了一个简单的pdf上传程序,我需要处理上传的文档。由于处理可能需要一段时间,我希望这是在后台完成。 工作流程如下所示: 我希望用户上传文档,当文档保存在数据库中时,他应该能够在网站上做其他事情,包括上传新文档。用户不应该知道任何有关后台处理的信息 我的实现如下所示: [HttpPost] public async virtual Task<ActionResult> Confirm(string author, string title) { /

我在ASP.NETMVC中实现了一个简单的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");
}
[HttpPost]
公共异步虚拟任务确认(字符串作者、字符串标题)
{
//...
previousDocumentIsProcessing=true;
等待InvokedDocumentProcessor(_document.Path,_document.DocumentID);
previousDocumentIsProcessing=false;
返回视图(“成功”);
}
问题是在处理完成后显示“成功”视图。由于操作是异步的,用户可以点击周围并执行其他操作,但是我想要创建一个后台进程,启动它并立即显示“Success”视图。用户不应该为处理而烦恼

我怎样才能做到这一点? 我曾尝试使用后台工作程序,但它不起作用(我得到的错误是异步进程无法在该点启动)

用户不应该知道任何有关后台处理的信息

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

我怎样才能做到这一点

正如我在博客上解释的那样

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

如果你想要一个不合适的(内存中的)解决方案,我有。

这个解决方案怎么样


我很确定用户不应该知道处理过程,因为我所做的只是提取pdf的内容(逐字)并将其保存到数据库中,以便上传的文档可以搜索。Windows Azure上的解决方案听起来非常不错,但是这是一个简单的大学项目,使用Windows Azure不是一个选项。我会检查“不合适”的解决方案,然后给你回复。感谢您的回答:)您可以让Windows服务或控制台应用程序执行与Azure worker角色相同的操作。Stephen刚刚建议实现该模式。正确。Azure示例只是示例。您还可以(分别)使用:本地文件系统、MSMQ(或本地数据库)和Win32服务。
[HttpPost]
public ActionResult Vote(long id, VoteDirection vote)
{

  IISTaskManager.Run(() =>
  {
      ...
  }
  );

return View("Success");