更新进度条时的最佳做法是什么

What is the best practice when updating a progress bar?

本文关键字:最佳 是什么 更新      更新时间:2023-09-26

我目前正在ASP.NET MVC 4中进行一个项目,并附带了一个需要进度条的模块。我现在的问题是"实现异步进度条的最佳方式是什么?"。

经过一番查找,我发现了以下方法:

  1. 在C#代码中创建一个startEvent()和getProgress()
  2. 使用javascript setTimeout()异步调用getProgress()方法

(例如:https://www.devexpress.com/Support/Center/Example/Details/E4244)

我对这个方法的评论是,这会导致代码依赖于您选择的超时。因此,要找到最佳和最具性能的超时需要一些技巧。


现在,在我研究此事之前,我最有可能使用的方法是:

  1. 在代码隐藏中,创建一个方法handleItem(int index),该方法获取一个索引,并对该索引处的项执行您想要执行的所有操作
  2. 确定要处理的项目数,并将其传递给javascript
  3. 在javascript中,启动一个从0循环到amount-1的for循环,对于每个索引,它启动一个对handleItem(i)的ajax调用
  4. 在ajax调用的完整语句中,您可以使用新的金额更新进度条

我的问题如下:

  1. 这是否暴露了太多的程序逻辑
  2. 当每次调用都往返于服务器时,这是否会产生太多开销
  3. 我不应该使用这种方法还有其他原因吗

提前感谢
Koen Morren

这不是推荐的策略,因为客户端驱动进程。如果连接中断,或者用户关闭浏览器,该过程将停止。

通常,如果您使用直接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获取状态更改的通知。

总之,轮询比推送机制具有更多的滞后性。客户端不应该驱动异步进程,但应该通知它们或为它们提供一些关于异步进程状态的机制。

与ASP.NET不同,MVC中几乎没有将数据从服务器推送到客户端的方法,WebSockets或类似SingnalR的api可以为您工作。

ajax方法很好,它为您提供了可靠的机制来更新数据,无论用户转到其他页面还是关闭浏览器,每次启动ajax都会更新UI。因此,javascript中有一个合理的间隔并没有错。

  1. 这是否暴露了太多的程序逻辑?

    代码将只写在类文件中以计算当前%年龄。

2.当每次调用都往返于服务器时,这是否会产生太多开销?

不,ajax是轻量级调用

3.我不应该使用这种方法还有其他原因吗?

这种方法将允许用户自由导航到其他资源,因为ajax将独立工作。