编写异步控制器并更新进度
Posted
技术标签:
【中文标题】编写异步控制器并更新进度【英文标题】:Writing an async controller and updating progress 【发布时间】:2012-09-25 23:31:36 【问题描述】:我目前正在考虑使用 async/await 功能来:
-
提交文件。
例如,此文件可能包含一个或多个条目。 (例如,可以是一个只有一个元素的 XML 文件,或者每个文件可以列出多个节点)
我需要单独处理每个呼叫,将其添加到已完成项目列表中,并将进度作为单个任务完成后返回。 (已完成:0/2 ----> 已完成 1/2...)
需要将此发送回视图,以便使用此功能的任何人都可以看到单个呼叫已被导入。
为了实现这一点,我将使用 Json 异步更新页面/进度条。
我预见到的问题是这样的:
当我调用提交以转到控制器时,我需要对每个单独的调用做出响应。在我提交文件并已经完成一些处理(以确定每个呼叫节点)之前,我不知道文件中有多少呼叫。对于我添加到列表中的每个已完成项目,是否有一种简洁的方法来获取响应?
【问题讨论】:
【参考方案1】:很遗憾,async
和 await
无法做到这一点。正如我在我的博客上解释的那样,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 下载进度