加载DOM然后在长时间运行期间进行操作

时间:2014-04-21 13:27:01

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

我正在编写一个包含几个不同步骤的.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,但不知道如何在流程方面集成它们。

有没有人对如何设置事情有什么建议?

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

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

1 个答案:

答案 0 :(得分: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)。 ASync让你说(1,2,3,4,5 GO ......等待所有)。

如果你想要一些UI改进来展示你在这个过程中的位置......你可能更适合拥有一个基本的Web前端,以及一些启动流程的WCF服务,其中你的前端结束用户界面可以定期轮询并显示更新的进度.jQuery可以做到这一点......设置你的后端服务将是一项艰苦的工作。

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

希望这有帮助!