我目前正在开发ASP.NET MVC 4中的一个项目,并且出现了一个需要进度条的模块。我现在面临的问题是“实现异步进度条的最佳方法是什么?”。
经过一些查询后,我遇到了以下方法:
(例如:https://www.devexpress.com/Support/Center/Example/Details/E4244)
我对此方法的评论是,这会导致代码依赖于您选择的超时。因此,需要一些小小的工作才能找到最佳且性能最佳的超时。
现在,在研究此事之前,我最有可能使用的方法如下:
我的问题如下:
提前致谢
Koen Morren
答案 0 :(得分:0)
这不是推荐的策略,因为客户端驱动该过程。如果有任何连接中断或用户关闭浏览器,则该过程将停止。
通常,如果您使用直接HTTP,则需要从javascript轮询(也称为pull)。伪代码就是这样的:
Call Creates Task ID and sends it to client
Client queries the status of task with given ID
另一种可能性是WebSockets,它允许您的客户端侦听服务器推送的更改。
存储给定状态的进度有很多选项。您可以按HttpContext
,任务ID或某个用户ID索引进度,甚至将其存储在数据库中,并使用SqlDependency
来获取状态更改的通知。
总之,轮询比推送机制更滞后。客户端不应该驱动异步进程,但应该通知它们或提供有关异步进程状态的一些机制。
答案 1 :(得分:0)
与ASP.NET不同,在MVC中将数据从服务器推送到客户端的方法很少,WebSockets或像{api(s)这样的SingnalR可以为你工作。
ajax方法很好,无论用户访问其他页面还是关闭浏览器,都会为您提供可靠的更新数据机制,每次ajax启动它都会更新UI。所以在javascript中只有一个公平的间隔没有错。
这是否暴露了太多的程序逻辑?
代码将仅在类文件中编写,以计算当前的%age。
2.这会产生太多的开销,因为每次调用都会进入服务器并返回吗?
不,ajax是轻量级的电话
3.还有其他原因我不应该使用这种方法吗?
此方法允许用户自由导航到其他资源,因为ajax将独立工作。