如何使用服务器端任务的进度更新网页?

时间:2010-03-16 19:48:22

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

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

现在,这个计算可能需要一分钟左右,所以我希望能够为用户提供有关其进度的更新。显然,快速而肮脏的解决方案是在旋转齿轮类型图形的基础上提出“请等待我们计算您的建议”的信息。 (或者其他什么,你明白了......)。任务完成后,我将重定向到结果页面。

然而,我想做一些更华丽的事情。也许是一个进度条的东西,甚至提示用户在后台发生了什么。例如,给他们一个进度条,一些文字说“现在处理建议3的15;多维生素”

有关如何设置此内容的任何建议?我想要做的一种方法是将计算方法的进度写入HttpContext,然后提出一个更新面板和计时器来显示/刷新此信息。我还检查了可能构建一个Web服务/方法,然后在某个时间间隔进行轮询。

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

再次感谢!

〜吉姆

3 个答案:

答案 0 :(得分:1)

如果您从未去过AjaxPatterns.org,那么我建议您按顺序访问。您要寻找的相关阅读材料是:

Progress Indicator

这包括几个完成目标的模式以及你已建议的两个模式。如果你想要实际进度指示,那么你将不得不做一些工作,但基本模式如下:

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

答案 1 :(得分:0)

你对使用HttpContext的建议最终是大多数人做这类事情的。有很多方法可以赞美它,但这才是真正发生的事情。

有一种方法可以让你在某种单例(或其他东西)中注册这些并行线程中的每一个并定期(每10秒?)让你的AJAX调用 ping 该线程要求它是如何进行的,它可以返回一个完整的百分比,供您显示给您的用户。但是,在幕后,它只是一个AJAX调用。您甚至可以根据您向其他线程提出的问题得到的一些回复来改变支票的频率。

答案 2 :(得分:0)

过去,我曾与噱头相似。它们最初通常都可以,但是后端必须开始报告更多正在发生的事情,因此客户端可以将其显示给可能会或可能不会关心它的用户。

我们过去做过的一件事就是简单地在页面上放一个倒数计时器(或进度条等)和一些旋转文本,说明我们要对数据做什么 ,ala安装人员。它不一定特定于正在发生的事情,而是它的一般情况,我们可以定期在服务器端更新它。

如果你想走初始路线我会建议你将分析任务分成流程并用流程的进度更新集合,然后当客户端回调(通过ajax,或刷新,或魔术)你只需给他们回复状态集合,给每个状态一个UID,客户端可以确定是否需要更新,这样你可以看到许多状态变化,如果它们发生在调用之间,你最小化你需要做的工作“过程”报告其状态。