1

在我的 Web 应用程序中,有一个进程可以查询来自整个 Web 的数据,对其进行过滤并将其保存到数据库中。你可以想象这个过程需要一些时间。我目前的解决方案是增加页面超时并在加载时为用户提供 AJAX 进度条。这是一个问题有两个原因 - 1)它仍然需要很长时间并且用户必须等待 2)它有时仍然超时。

我已经涉足线程化进程,并阅读了我应该将它异步发布到 Web 服务(“一劳永逸”)。

我读过的一些参考资料:
- MSDN
- Fire and Forget

所以我的问题是——最好的方法是什么?

更新:在用户输入他们的数据后,我想将他们重定向到结果页面,随着进程在后台运行,该页面会逐渐更新。

4

7 回答 7

7

为了避免过多的架构天文学,我经常使用隐藏的 iframe 来调用长时间运行的进程并流回进度信息。结合jsProgressBarHandler 之类的东西,您可以很容易地为较长的任务创建出色的带外进度指示,而通用进度动画不会削减它。

在您的特定情况下,您可能希望对每个任务使用一个 LongRunningProcess.aspx 调用,以避免这些页面超时。

例如,调用 LongRunningProcess.aspx?taskID=1 将其启动,然后在该任务结束时发出一个

document.location = "LongRunningProcess.aspx?taskID=2".  

令人作呕。

于 2008-09-16T15:15:30.040 回答
3

我们遇到了类似的问题,并通过异步 Web 服务调用开始工作(这意味着用户不必等待工作完成)来解决它。Web 服务随后启动了一个 SQL 作业,该作业执行该工作并定期用工作状态更新一个表。我们提供了一个允许用户查询表格的 UI。

于 2008-09-16T14:50:58.867 回答
1

我在上一份工作中遇到了这个确切的问题。我发现最好的方法是启动一个异步进程,并在完成时通知用户(电子邮件或其他)。由于超时和浪费他们的生产力,让他们等待那么长时间将是一个问题。让他们等待进度条可能会给他们一种错误的安全感,即他们可以在关闭浏览器时取消该过程,这可能并非如此,具体取决于您如何设置系统。

于 2008-09-16T14:41:59.637 回答
0
  1. 您如何查询远程数据?
  2. 它多久改变一次?
  3. 结果是否可以缓存一段时间?
  4. 我们在这里实际谈论的是多长时间?

“最佳方法”可能在某种程度上取决于这些问题的答案......

于 2008-09-16T14:48:46.687 回答
0

您可以创建另一个线程并在会话或应用程序状态中存储对该线程的引用,具体取决于线程是每个网站只能运行一次,还是每个用户会话运行一次。
然后,您可以将用户重定向到他可以监控线程进度的页面。您可以将页面设置为自动刷新,或向用户显示刷新按钮。
线程完成后,您可以向用户发送电子邮件。

于 2008-09-16T14:51:07.617 回答
0

我对此的解决方案是一个带外服务,它执行这些并将它们缓存在数据库中。

当这个人第一次提出要求时,他们会稍等片刻,然后它会显示出来,但如果他们刷新,它会立即出现,然后,因为它是 int he db,它现在是下一个每小时更新的一部分自上次请求后 24 小时。

于 2008-09-16T14:51:38.083 回答
0

将作业及其相关参数添加到作业队列表。然后,编写一个 Windows 服务来获取这些作业并对其进行处理,将结果保存到适当的位置,并通过电子邮件向请求者发送结果链接。提供某种 UI 也是一个不错的选择,这样用户就可以检查他们的工作状态。

这种方式比启动单独的线程或增加超时要好得多,特别是如果您的应用程序较大并且需要扩展,因为您可以在必要时简单地添加多个服务器来处理作业。

于 2008-09-16T15:20:31.680 回答