繁体   English   中英

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

[英]What's the best way to handle long running process in an ASP.Net application?

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

我涉猎线程流程,并已阅读应将其异步发布到Web服务(“即发即弃”)。

我读过的一些参考资料:
-MSDN
- 忘了火

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

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

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

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

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

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

恶作剧。

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

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

  1. 您如何查询远程数据?
  2. 它多久更改一次?
  3. 结果是否可以缓存一段时间?
  4. 我们实际上在这里谈论多长时间?

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

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

我对此的解决方案是一种带外服务,它可以完成这些任务并将其缓存在db中。

当该人第一次请求某项内容时,他们会稍等一会,然后出现,但如果刷新,它会立即显示,然后,因为它是数据库,所以现在是下一次每小时更新的一部分自上次请求起24小时。

将作业及其相关参数添加到作业队列表中。 然后,编写一个Windows服务,该服务将拾取并处理这些作业,将结果保存到适当的位置,然后通过电子邮件将结果链接发送给请求者。 提供某种类型的UI也很不错,以便用户可以检查其工作状态。

这种方法比启动单独的线程或增加超时要好得多,尤其是在您的应用程序较大且需要扩展的情况下,因为您可以根据需要简单地添加多个服务器来处理作业。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM