在ASP.Net应用程序中处理长时间运行进程的最佳方法是什么?

时间:2008-09-16 14:38:47

标签: c# .net asp.net asp.net-ajax

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

我已经涉足了线程,并且已经阅读了我应该将其异步发布到Web服务(“Fire and forget”)。

我读过的一些参考文献:
- MSDN
- Fire and Forget

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

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

7 个答案:

答案 0 :(得分:7)

为了避免过多的建筑天文学,我经常use a hidden iframe to call the long running process and stream back progress information。与jsProgressBarHandler之类的东西相结合,您可以非常轻松地为更长的任务创建出色的带外进度指示,其中通用进度动画不会削减它。

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

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

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

Ad nauseum。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我在上一份工作中遇到了这个问题。我找到的最好方法是启动异步过程,并在完成后通知用户(电子邮件或其他内容)。让他们等待那么久会因为超时和他们的生产力浪费而成为问题。让他们等待进度条会给他们错误的安全感,他们可以在关闭浏览器时取消进程,这可能不是这种情况,具体取决于您设置系统的方式。

答案 3 :(得分:0)

  1. 您如何查询远程数据?
  2. 多久更改一次?
  3. 结果是否可以缓存一段时间?
  4. 我们在这里谈论了多长时间?
  5. “最佳方法”可能在某种程度上取决于这些问题的答案......

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我对此的解决方案是一个带外服务,它可以执行这些操作并将它们缓存在db中。

当这个人第一次要求某事时,他们会等待一段时间,然后它就会出现但是如果他们刷新,那就立即了,然后,因为它的数据库是db,它现在是每小时更新的一部分从最后一次请求开始的下一个24小时。

答案 6 :(得分:0)

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

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