【问题标题】:Progress Updates on Long Process with Javascript使用 Javascript 进行长进程的进度更新
【发布时间】:2010-03-07 18:23:24
【问题描述】:

我有一个调用 dll 的 asp.net 页面,该 dll 将启动一个更新产品信息的漫长过程。随着流程的运行,我想向用户提供有关该流程所在的产品以及产品状态的持续更新。我一直无法让这个工作。我将信息添加到日志文本文件中,我想我会重定向到一个新页面,并让该页面每隔几秒钟使用 Javascript 从文本文件中读取一次。我的问题是有没有其他人尝试过这个并且效果很好?

【问题讨论】:

    标签: asp.net javascript long-running-processes


    【解决方案1】:

    我会使用 Ajax 并轮询该文本文件以获取更新。

    【讨论】:

    • 我不会,日志文件太大了,你不能每隔几秒就连续轮询一次。
    • 一个非常简单的方法是让页面定期向 ASPNET 服务器发送 AJAX 查询,它以某种方式跟踪状态,可能通过重新读取日志文件,或者可能以其他方式方式。这取决于 ASPNET 服务器来有效地执行此操作。
    • 我们在讨论多大的问题? AJAX 调用背后的服务器端方法应该能够处理它。如果不了解有关日志文件的更多信息,很难说,但每个日志条目上都有一个日期时间戳,您只能返回更改的结果。
    • 这需要在 SQL 数据库中写入日志文件。
    【解决方案2】:
    • 制作长流程,以便更新有关进度的某些状态 - 状态、最后处理的产品等。
    • 一旦开始,您可能希望只更新每处理 50 个项目的进度,以节省 ASP.NET 端的资源(您可能不会,这取决于您想要什么)。
    • 如果处理与当前会话相关联,您可能希望将状态放入会话中。如果不是 - 例如global - 将其置于某个全局状态。
    • 然后通过 javascript 中的 Ajax 不时轮询状态,例如使用JSON 并相应地更新 UI。
    • 确保在访问共享状态时使用正确的锁定。
    • 另外,尽量保持状态较小(仅存储获取 js gui 数据绝对需要的内容)。

    【讨论】:

      【解决方案3】:

      您可以将状态输出到数据库表,而不是将状态输出到基于文本的日志文件(或者,除了使用日志文件;您可以同时使用两者)。例如,将表格结构如下:

      Queue:
        id (Primary Key)
        user_id (Foreign Key)
        product_id (Foreign Key) //if available
        batch_size //total set of products in the batch this message was generated from
        batch_remaining //number remaining in this batch
        message
      

      所以现在你有一个队列。现在,当用户进入特定页面时,您可以执行以下两种操作之一:

      1. 从队列中获取一些相关数据并显示在标题中。每次刷新页面时都会更新。
      2. 创建一个 AJAX 处理程序,它将轮询 Web 服务以每隔一段时间获取数据。这样,您可以每 15 或 20 秒更新一次状态,即使用户在同一页面上而无需刷新。

      您可以在发送后从队列中删除行,或者如果您想保留该数据,请添加另一个名为sent 的列,并在用户看到该数据后将其设置为true

      【讨论】:

      • 是的,AJAX,一种网络服务/方法和持续轮询是唯一的方法 [for IE]。您必须使用数据库并将日志文件写入数据库(带有时间戳/日期时间)并连续进行增量轮询。在 iframe 中使用 reverse-ajax [并且 reverse-ajax 不需要数据库,实际上,您可以像在控制台上那样做],速度要快得多,但是在 IE 中,reverse-ajax 不起作用。
      猜你喜欢
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 2013-03-08
      • 2011-06-12
      • 1970-01-01
      • 2016-04-02
      相关资源
      最近更新 更多