Web浏览器挂起应用程序的DoEvents

时间:2014-09-17 18:19:04

标签: vb.net webbrowser-control

我继承了一些自动化Webbrowser控件并且遇到麻烦的代码。在处理时,第一次运行任务时,它可以毫无问题地进行处理。然而,第二次它将在处理的中途挂断。在调试中,看起来它总是在对Application.DoEvents()的调用中挂起。

一小段代码及其卡住的地方:

RS: Try
        Do Until ie2.ReadyState = WebBrowserReadyState.Complete
            Application.DoEvents() ' WILL LOOK STUCK HERE
            If SecondsCounted >= 20 Then Exit Do
            UpdateBrowserLabel(ie2.Name, DiagnosticLabelString & " - NOT COMPLETE!")
        Loop
    Catch ex As Exception
        fmain.lblDiagnostic.Text = "exception: ReadyState loop"
        TickTick("0.1")
        GoTo RS
    End Try

有两个定时器(System.Windows.Forms.Timer)正在运行,其中一个定时器以间隔1000运行并包含DoEvents调用并递增SecondsCounted变量。第二个计时器的间隔为5,包含对DoEvents()的调用,并从user32调用LockSetForegroundWindow。

在跑步时,程序开始变慢。看起来任何时候Webbrowser都用javascript做了什么,然后"暂停"将通过调用" DoEvents"来显示该程序,这需要更长的时间才能完成。

如何阻止我的应用程序长时间停滞并最终冻结?是否有比DoEvents更好的东西,以保持程序的响应?我试图删除所有对DoEvents的调用,程序实际上停止了工作。

任何帮助/建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

循环将疯狂重复,直到浏览器完成或20秒过去。也许您不需要循环 - 每秒检查以查看浏览器是否已完成可能就足够了。

它似乎停留在DoEvents上,因为这是允许进程响应其他事情的命令(即您暂停应用程序的请求)

自VB6以来,世界已经变得更加异步,因此保持UI响应的当前方式是使用事件和回调。您可以使用Web浏览器执行此操作 - 我非常确定它会在完成或遇到错误时引发并发生事件。