在ASP.Net应用程序中处理长时间运行的最佳方法是什么?
在我的Web应用程序中,有一个过程可以从整个Web查询数据,对其进行过滤,然后将其保存到数据库中。可以想象,此过程需要一些时间。我当前的解决方案是增加页面超时并在加载时向用户提供AJAX进度条。这是一个问题,有两个原因:1)它仍然需要花费很长时间并且用户必须等待2)它有时仍然超时。
我涉猎线程流程,并已阅读应将其异步发布到Web服务("即发即弃")。
我读过一些参考资料:
MSDN
火与忘了
所以我的问题是最好的方法是什么?
解决方案
回答
更新:在用户输入他们的数据之后,我想将它们重定向到结果页面,该页面随着进程在后台运行而逐渐更新。
回答
- 我们如何查询远程数据?
- 它多久更改一次?
- 结果是否可以缓存一段时间?
- 我们实际上在这里谈论多长时间?
我上一份工作遇到了这个确切的问题。我发现最好的方法是启动一个异步进程,并在完成时通知用户(电子邮件或者其他方式)。由于超时和浪费生产力,让他们等待那么长时间会成问题。让他们等待进度条会给他们一种错误的安全感,即他们关闭浏览器时可以取消该过程,但实际情况可能并非如此,具体取决于我们如何设置系统。
回答
"最佳方法"可能在某种程度上取决于这些问题的答案。
回答
我们遇到了一个类似的问题,并通过一个异步Web服务调用来开始工作,从而解决了该问题(这意味着用户不必等待工作完成)。然后,Web服务启动了一个SQL作业,该作业执行了该工作,并定期用该工作的状态更新了一个表。我们提供了一个UI,允许用户查询表。
回答
我们可以创建另一个线程,并在会话或者应用程序状态下存储对该线程的引用,具体取决于该线程在每个网站或者每个用户会话只能运行一次。
然后,我们可以将用户重定向到一个他可以监视线程进度的页面。我们可以将页面设置为自动刷新,或者向用户显示刷新按钮。
线程完成后,我们可以向用户发送电子邮件。
我对此的解决方案是一种带外服务,该服务可以执行这些操作并将其缓存在db中。
回答
当该人第一次请求某项内容时,他们会稍等一下,然后显示出来,但是如果他们刷新,则会立即看到它,然后,因为它是内部数据库,所以它现在是下一次每小时更新的一部分自上次请求起24小时。
为了避免过多的架构天文学,我经常使用隐藏的iframe来调用长时间运行的流程并流回进度信息。结合jsProgressBarHandler之类的东西,我们可以轻松地为较长的任务创建出色的带外进度指示,而普通的进度动画不会削减该进度指示。
在特定情况下,我们可能希望每个任务使用一个LongRunningProcess.aspx调用,以避免这些页面超时。
document.location = "LongRunningProcess.aspx?taskID=2".
例如,调用LongRunningProcess.aspx?taskID = 1将其启动,然后在该任务结束时发出一个
回答
恶作剧。
将作业及其相关参数添加到作业队列表中。然后,编写一个Windows服务,该服务将拾取并处理这些作业,将结果保存到适当的位置,然后通过电子邮件将结果链接发送给请求者。提供某种类型的UI也很不错,以便用户可以检查其作业的状态。
段落数量不匹配