【问题标题】:How do I update a webpage with the progress of a server-side task?如何使用服务器端任务的进度更新网页?
【发布时间】:2010-03-16 19:48:22
【问题描述】:

我正在开发一个网络项目,该项目从调查类型的应用程序中获取结果,并通过一系列计算运行它们,以便为用户提供一些推荐建议。

现在,这个计算可能需要一分钟左右,所以我希望能够向用户提供一些关于它的进度的更新。显然,快速而肮脏的解决方案是使用旋转齿轮类型的图形发布一条类似于“请稍候,我们正在计算您的建议”的消息。 (或其他什么,你明白了..)。任务完成后,我会重定向到结果页面。

但是,我想做一些更华丽的事情。也许类似于进度条,甚至提示用户后台发生的事情。例如,给他们一个进度条,上面写着“现在处理 15 条中的第 3 条建议;多种维生素”

关于如何设置它的任何建议?我正在考虑的一种方法是将计算方法的进度写入 HttpContext,然后启动一个更新面板和计时器来显示/刷新此信息。我还检查了可能构建 Web 服务/方法,然后每隔一段时间进行轮询。

以前有人做过类似的事情吗?什么对你有用?

再次感谢!

~吉姆

【问题讨论】:

    标签: c# ajax progress-bar web-applications


    【解决方案1】:

    如果您从未访问过 AjaxPatterns.org,那么我建议您访问一下。您要查找的相关阅读材料是:

    Progress Indicator

    这涵盖了实现目标的几种模式以及您已经建议的两种模式。如果您想要实际的进度指示,那么您将不得不做一些工作,但基本模式如下:

    1. 启动长时间运行的任务(可能在单独的线程上)
    2. 创建一个表明工作完成的共享资源,以及一个可以检索该信息的唯一键。这可以在内存、数据库、文件系统中完成...
    3. 将该密钥传回给客户端
    4. 在客户端,使用该键每隔一段时间轮询进度更新
    5. 使用基于值的进度指示器更新客户端显示 返回。

    【讨论】:

      【解决方案2】:

      您对使用 HttpContext 的建议最终是大多数人如何做这种事情。有很多方法可以美化它,但事实就是如此。

      一种这样的方法是让您在某种单例(或其他东西)中注册这些并行线程中的每一个,并定期(每 10 秒?)让您的 AJAX 调用 ping 该线程来询问它是如何进行的,它可以返回一个完整的百分比供您显示给您的用户。但是,在幕后它只是一个 AJAX 调用。您甚至可以根据您在询问其他线程发生了什么时得到的一些响应来改变检查频率。

      【讨论】:

        【解决方案3】:

        我过去曾研究过类似的噱头。它们最初通常没问题,但问题在于后端必须开始报告更多正在发生的事情,以便客户端可以将其显示给可能关心或不关心它的用户。

        我们过去做过的一件事是简单地在页面(或进度条等)上放置一个倒数计时器和一些旋转文本,说明 我们将如何处理数据 , ala 安装程序。它不一定特定于正在发生的事情,但它是一般性的,我们可以定期在服务器端更新它。

        如果您想走您的初始路线,我建议您将分析任务划分为进程并根据进程的进度更新集合,然后当客户端回调(通过 ajax、刷新或魔术)时,您只需将状态集合返回给他们,给每个状态一个 UID,客户端就可以确定它是否需要更新,这样如果它们在调用之间发生,您可以看到许多状态更改,并且您可以最大限度地减少您需要做的工作“进程”报告其状态。

        【讨论】:

          猜你喜欢
          • 2017-09-29
          • 2012-08-07
          • 2012-02-22
          • 2010-09-12
          • 1970-01-01
          • 1970-01-01
          • 2012-12-14
          • 1970-01-01
          • 2016-06-22
          相关资源
          最近更新 更多