编写异步控制器并更新进度

Posted

技术标签:

【中文标题】编写异步控制器并更新进度【英文标题】:Writing an async controller and updating progress 【发布时间】:2012-09-25 23:31:36 【问题描述】:

我目前正在考虑使用 async/await 功能来:

    提交文件。 例如,此文件可能包含一个或多个条目。 (例如,可以是一个只有一个元素的 XML 文件,或者每个文件可以列出多个节点) 我需要单独处理每个呼叫,将其添加到已完成项目列表中,并将进度作为单个任务完成后返回。 (已完成:0/2 ----> 已完成 1/2...) 需要将此发送回视图,以便使用此功能的任何人都可以看到单个呼叫已被导入。

为了实现这一点,我将使用 Json 异步更新页面/进度条。

我预见到的问题是这样的:

当我调用提交以转到控制器时,我需要对每个单独的调用做出响应。在我提交文件并已经完成一些处理(以确定每个呼叫节点)之前,我不知道文件中有多少呼叫。对于我添加到列表中的每个已完成项目,是否有一种简洁的方法来获取响应?

【问题讨论】:

【参考方案1】:

很遗憾,asyncawait 无法做到这一点。正如我在我的博客上解释的那样,async does not change the HTTP protocol;每个请求都会得到一个响应,就是这样。

因此,当文件被提交时,为该文件创建某种标识符并将其提交到持久后台队列进行处理。您可以使用轮询/长轮询/websockets/SignalR 来通知客户端进度。

请注意,ASP.NET 假定如果没有未完成的请求,您的进程可以被回收,因此处理应该由 MVC 控制器之外的其他 控制器来完成。类似于 Win32 服务或 Azure 辅助角色。

此外,如果这是针对网络场中的站点,则需要从所有网络服务器访问您的持久队列。如果您在 Azure Web 角色上托管,它不能在磁盘(或 MSMQ)上,因为 Azure 会回收您的整个计算机 - 在这种情况下,它应该在 Azure 存储或服务总线中。

【讨论】:

【参考方案2】:

不确定您的确切要求是什么,但您可以使用现成的上传控件来满足要求,例如 Telerik MVC 上传扩展及其免费!

http://demos.telerik.com/aspnet-mvc/upload

或者您可以自定义滚动您自己的;我在想的是,当用户上传 xml 文件/文件时,控制器方法可以将它们放入后台队列中进行处理,或者将其交给负责处理并返回票号的 Windows 服务客户端。公开另一个 webservice/restful 服务,该服务提供通过票号查询的文件上传的进度/状态,并让您的客户端/网站每隔一段时间查询 web 服务以获取进度并向用户显示进度。

认为您可能会发现使用现有的 MVC 上传扩展更容易,所以不需要重新发明***,无论如何我的想法 :-)

【讨论】:

以上是关于编写异步控制器并更新进度的主要内容,如果未能解决你的问题,请参考以下文章

主视图控制器外的多线程进度条并发问题

更改视图控制器后如何更新 UIProgressView 以显示 NSUrlSession 下载进度

将函数的进度输出到执行 Promise 内部的控制台 [重复]

Symfony Ajax 进度条

快速文件复制与进度

根据 API 的响应异步更新进度条