我正在编写一个.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(对吧?我对网络开发还是很陌生,所以我正在努力解决问题)。
我的其他一些想法是让长时间运行的进程使用异步调用并使用异步调用来完成任务,但我不知道在那之后我会做什么。我也考虑过如何使用JavaScript或AJAX,但也不确定如何在流程方面集成这些。
考虑到事情的安排,有人对该怎么办有什么建议吗?
哦,我的最后一个想法是将长时间运行的流程拆分为对网页的多个调用,每次只执行其中的不同部分。尽管如此,如果我这样做的话,我将不得不对事情进行重大重组,但如果这是唯一的方法,那就顺其自然吧。
谢谢你的帮助,我很感激。希望我解释得足够好。。。
您可以尝试在服务器端代码上使任务异步(http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx和http://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服务,您的前端UI可以定期轮询并显示更新的进度。。jQuery可以让这件事变得微不足道。设置后端服务将是一项艰巨的工作。
话虽如此,我几年前就用ASP.NET写过这样的东西,但随着时间的推移,ASP.NET并不适合这样的长时间运行操作。这并不是说你不能做到。当然,你可以,但IIS是为快速输入\快速输出HTTP请求和响应而构建的。像这样长时间运行的操作会占用可用的连接并占用服务器内存。如果你有选择的话,我建议你把这些操作放在..至少。。一些服务层。如果你根本不需要UI来展示这些东西。。使用控制台项目。它的代码有95%相同,但服务器能够更好地启动和完成它,这比长时间运行的ASP.NET网页要好得多。
希望这能有所帮助!