【问题标题】:Load DOM then manipulate during long-running operation加载 DOM,然后在长时间运行期间进行操作
【发布时间】:2014-04-21 13:27:00
【问题描述】:

我正在编写一个包含几个不同步骤的 .aspx 页面,其中一个步骤是一个长时间运行的操作(将信息与 Web 服务同步)。因此,当页面开始加载该步骤时,它显然会在该操作期间挂起并且没有完全加载页面,然后当它完成同步时它完成加载页面。在这个长时间运行的操作中,我希望有一个进度条随着同步的运行而更新。我认为,棘手的事情是长操作是服务器端的,而不是 JavaScript。

该网站的基本设置如下(我无法真正显示实际代码,我意识到这没有帮助):

Dim ourObject as New OurObject(...)
ourObject.AddSiteHeader()

'Series of If statements to determine the step

ElseIf currentStep = "This Value"
'Long-running operation step
End If

ourObject.AddSiteFooter()
ourObject.Kill()
ourObject = Nothing

使用该设置,问题是在此过程中页面不加载,然后切换到部分加载的网页,然后在同步结束时自发完成。这是预期的,但不是我想要的。

然后我尝试了这个。

Dim ourObject as New OurObject(...)
ourObject.AddSiteHeader()

'Series of If statements to determine the step

ElseIf currentStep = "This Value"
Response.Flush()
'Long-running operation step
End If

ourObject.AddSiteFooter()
ourObject.Kill()
ourObject = Nothing

这有助于从一开始就部分加载页面,但在此过程中它仍然被挂起,再次预期但不希望。

我尝试过的最后一件事是:

Dim ourObject as New OurObject(...)
ourObject.AddSiteHeader()

'Series of If statements to determine the step

ElseIf currentStep = "This Value"
ourObject.AddSiteFooter()
Response.Flush()
'Long-running operation step
End If

If currentStep <> "This Value"
    ourObject.AddSiteFooter()
End If
ourObject.Kill()
ourObject = Nothing

哪个让我最接近,因为它实际上加载了整个页面然后执行操作,但是它不能完全工作,因为即使加载了整个页面,它看起来也不正确(它看起来很皱?最好的方法我可以把它),直到过程完成后。但即使它看起来确实正确,因为我已经加载了页脚,我将无法操作 DOM(对吗?我对 Web 开发还是很陌生,所以我想弄清楚)。

我的一些其他想法是让长期运行的进程使用异步调用并用它来做事,但我不知道我会做什么。我还考虑过如何使用 JavaScript 或使用 AJAX 做事,但也不确定如何在流程方面集成这些。

鉴于事情的设置方式,有人对如何做有任何建议吗?

哦,我的最后一个想法是将长时间运行的进程拆分为对网页的多次调用,并且每次只执行它的不同部分。虽然,如果我这样做的话,我必须对事情进行大的重组,但如果这是唯一的方法,那就这样吧。

感谢您的帮助,我很感激。希望我解释得足够好...

【问题讨论】:

    标签: javascript asp.net .net dom long-running-processes


    【解决方案1】:

    您可以尝试在服务器端代码上使您的任务异步(http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspxhttp://www.asp.net/web-forms/tutorials/aspnet-45/using-asynchronous-methods-in-aspnet-45 是值得一看的好东西)。简而言之,这将让您一次启动一堆任务,但在完成之前不会加载页面。目前您的代码正在启动一个任务..等待..完成..然后移动到下一个(1,然后 2,然后 3,然后 4,然后 5)。异步让你说(1,2,3,4,5 GO...等等)。

    如果您想要一些 UI 改进来展示您在流程中的位置。您可能更适合拥有一个基本的 Web 前端,以及一些在后台启动流程的 WCF 服务,其中您的前端端 UI 可以定期轮询并显示更新的进度。jQuery 可以让这件事变得微不足道。设置后端服务将是一项艰巨的工作。

    话虽如此,几年前我曾经用 ASP.NET 编写过类似的东西,但随着时间的推移,ASP.NET 并不适合长时间运行的操作。并不是你不能这样做.. 你当然可以,但是 IIS 是为快速输入\快速输出 HTTP 请求和响应而构建的。像这样长时间运行的操作会破坏可用连接并消耗服务器内存。如果你有选择,我建议你把这些操作放在......至少......一些服务层。如果您根本不需要 UI 来展示这些东西.. 使用控制台项目。 95% 的代码相同,但服务器管理启动和完成它比长时间运行的 ASP.NET 网页要好得多。

    希望这会有所帮助!

    【讨论】:

    • 谢谢先生。是的,我考虑过异步方法,但我不确定这是否是我正在寻找的。但是你说的后两个选项是什么意思?我并没有完全理解那些是什么或你的意思(就像他们的过程一样,我明白他们背后的想法)。另外,至于最后一个...我不需要 UI 来显示进度,但由于它是我工作产品的一部分,我认为向用户展示是的,一些东西会很好确实正在发生。另外,非常感谢。
    • 当然是@JoshBraun。我想我对第 2 项和第 3 项的观点是.. 如果您真的需要以某种方式通过 UI 保持这个以 Web 为中心的方式,并且您不能走异步任务的方式,那么至少减轻您的 IIS 负载和不要将所有这些过程都放在“页面加载”方法中,而是将它们放在某个服务层中。或者,如果您可以完全摆脱 Web UI,那么请考虑使用控制台应用程序。要么等待,如果您可以在这段时间内阻止所有这些东西在 IIS 中运行,从长远来看,您会对此感到更高兴。有意义吗?
    • 有点...我对 Web 开发还很陌生,所以仍然试图把我的头绕在一些事情上哈哈。究竟什么是服务层? (或者知道一个好的链接?)另外,控制台应用程序到底是什么意思?那只是没有点击,因为我从未想过将控制台应用程序与 Web 开发混合在一起,所以不知道它们是如何融合的。
    • 好的,那么我建议你查找一些关于“三层架构”的基本信息,这样你就有了一个概念。简而言之,尽量不要把你所有的表示逻辑、业务逻辑和数据库查找逻辑都放在同一个代码后面。如果您保持这些“独立”彼此,您将在您的过程中拥有更大的灵活性。例如,使用服务层会将这些阻塞事务中的任何一个卸载到另一个服务器上,让您的页面快速加载并呈现 UI,但仍然允许您在应用程序中维护长时间运行的进程。
    • 因此,例如,如果是我,我会考虑创建一个带有“StartProcess”端点的 WCF 服务。然后,将您的长流程分解为一系列单独的子程序,这些子程序一个接一个地调用。在每个步骤中,您都可以写入一个表格,指示您在该过程中所处的步骤。您的 Web UI 可以定期轮询此表以指示已完成的操作以及您需要多长时间。这只是您可以处理此问题的众多方法之一,但它可以让网页快速加载,并将繁重的工作卸载到 IIS 之外的服务器上。 HTH!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多