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

时间:2013-11-20 08:46:19

标签: c# javascript jquery ajax asp.net-mvc-4

我目前正在开发ASP.NET MVC 4中的一个项目,并且出现了一个需要进度条的模块。我现在面临的问题是“实现异步进度条的最佳方法是什么?”。

经过一些查询后,我遇到了以下方法:

  1. 在C#代码中创建一个startEvent()和getProgress()。
  2. 使用javascript setTimeout()以异步方式调用getProgress()方法。
  3. (例如:https://www.devexpress.com/Support/Center/Example/Details/E4244

    我对此方法的评论是,这会导致代码依赖于您选择的超时。因此,需要一些小小的工作才能找到最佳且性能最佳的超时。


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

    1. 在代码隐藏中,创建一个方法handleItem(int index),它接受一个索引并执行你想要对该索引处的项做的所有事情。
    2. 确定要处理的项目数,并将其传递给您的javascript。
    3. 在javascript中,启动一个从0循环到数量-1的for循环,对于每个索引,它启动对handleItem(i)的ajax调用。
    4. 在该ajax-call的完整声明中,您可以使用新金额更新进度条。
    5. 我的问题如下:

      1. 这是否暴露了太多的程序逻辑?
      2. 这是否会产生过多的开销,因为每次调用都会进入服务器并返回?
      3. 我还有其他原因可以避免使用这种方法吗?
      4. 提前致谢
        Koen Morren

2 个答案:

答案 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中只有一个公平的间隔没有错。

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

    代码将仅在类文件中编写,以计算当前的%age。

  2. 2.这会产生太多的开销,因为每次调用都会进入服务器并返回吗?

    不,ajax是轻量级的电话

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

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