使用Javascript进行长进程的进度更新

时间:2010-03-07 18:23:25

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

  • 制作漫长的流程,以便更新有关进度的状态 - 状态,最后处理的产品等。
  • 一旦启动,您可能希望仅更新每个处理过的第50个项目的进度,以便在ASP.NET端备用资源(您可能不会,这取决于您的需求)。
  • 如果处理与当前会话相关联,您可能希望将状态置于会话中。如果不是 - 例如全球 - 把它放在一些全球状态。
  • 然后使用例如javascript通过Ajax偶尔轮询状态。 JSON并相应地更新UI。
  • 确保在访问共享状态时使用正确的锁定。
  • 此外,尝试保持状态较小(仅存储获取js gui数据所必需的内容)。

答案 2 :(得分:0)

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

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秒更新一次状态。
  3. 您可以在发送后删除队列中的行,或者如果您想保留该数据,请添加另一个名为sent的列,并在用户看到后将其设置为true那个数据。