关于c#:启动后台任务ASP.NET MVC 4.5

Starting a background task ASP.NET MVC 4.5

我在ASP.NET MVC中实现了一个简单的pdf上传器,我需要处理上传的文档。由于处理可能需要一段时间,因此我希望在后台完成此操作。
工作流程是这样的:
我希望用户上传文档,并且当文档保存在数据库中时,他应该能够在网站上执行其他操作,包括上传新文档。用户不应对后台的处理一无所知。

我的实现看起来像这样:

1
2
3
4
5
6
7
8
9
10
[HttpPost]
public async virtual Task<ActionResult> Confirm(string author, string title)
{
    //...
    previousDocumentIsProcessing = true;
    await InvokeDocumentProcessor(_document.Path, _document.DocumentID);
    previousDocumentIsProcessing = false;

    return View("Success");
}

问题是在完成处理后,正在显示"成功"视图。由于该操作是异步的,因此用户可以单击周围并执行其他操作,但是我要创建一个后台进程,然后启动它并立即显示"成功"视图。用户不应被处理打扰。

我该如何实现?
我已经尝试过使用后台工作程序,但是它没有用(我收到错误消息,指出此时无法启动异步进程)。


User should not know anything about the processing in the background.

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

How can I achieve this?

正如我在博客上所解释的,async不会更改HTTP协议。

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

如果您想要一个不合适的(内存中的)解决方案,我还有另一篇博客文章描述了这种方法。


那这个解决方案呢
http://brian-federici.com/blog/2013/7/8/ensuring-tasks-complete-in-aspnet-mvc

1
2
3
4
5
6
7
8
9
10
11
[HttpPost]
public ActionResult Vote(long id, VoteDirection vote)
{

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

return View("Success");