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

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

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

我的实现看起来像这样:

[HttpPost]
public async virtual Task<ActionResult> Confirm(string author, string title)
{
    //...
    previousDocumentIsProcessing = true; 
    await InvokeDocumentProcessor(_document.Path, _document.DocumentID);
    previousDocumentIsProcessing = false; 

    return View("Success");
}

问题是处理完成后显示“成功” View 。由于操作是异步的,因此用户可以点击并执行其他操作,但我想创建一个后台进程,启动它并立即显示“成功” View 。用户不应被处理打扰。

我怎样才能做到这一点? 我曾尝试使用后台 worker ,但它没有用(我收到错误消息,说此时无法启动异步进程)。

最佳答案

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

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

How can I achieve this?

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

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

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

关于c# - 启动后台任务 ASP.NET MVC 4.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21062464/

相关文章:

c# - 使用 linq 识别日期冲突

c# - 在 Linq 查询中执行代码块的语法?

javascript - jquery datepicker 和 asp.net c# 空值

javascript - JQuery datepicker() 通过 ASP.net 中的 CSS 类动态创建的 TemplateFields

asp.net-mvc - Razor 中 ( )(括号)和 { }(大括号)之间的区别

asp.net-mvc - T4MVC支持WebApi吗?

c# - 将我的 List<Roomtype> 转换为 SelectList for ASP。 NET MVC DropDownFor<>,并为每个选项项获取正确的值

c# - 我需要删除这种事件处理程序吗?

c# - 在 WPF 中关闭标签的最佳实践

asp.net - 我可以在 URL 中使用逗号吗?