0

我有这样的 Sub(),使用 GeckoWebBrowser 下载 HTML 页面

wb1 = Nothing
wb1 = New Gecko.GeckoWebBrowser
wb1.Navigate(v_url)
totalticks = 0
loadtimer.Start()
        Do
            If m_stop = True Then Exit Do
            If wb1.IsBusy = False Then 'wb1.ReadyState = WebBrowserReadyState.Complete Then
                If IsNothing(wb1.Document) = False Then
                    If IsNothing(wb1.Document.Body) = False Then
                        Exit Do
                    End If
                End If
            ElseIf wb1.IsBusy = True And String.IsNullOrEmpty(sucessID) = False Then  'wb1.ReadyState = WebBrowserReadyState.Interactive And String.IsNullOrEmpty(sucessID) = False Then
                If IsNothing(wb1.Document) = False Then
                    If IsNothing(wb1.Document.Body) = False Then
                        If InStr(wb1.Document.Body.InnerHtml, sucessID, CompareMethod.Text) <> 0 Then
                            Exit Do
                        End If
                    End If
                End If
            End If
            If totalticks = 15 Then
                'wb1.Dispose()
                wb1.Stop()  'wb1 = New System.Windows.Forms.WebBrowser
                wb1.Reload(Gecko.GeckoLoadFlags.IsRefresh)
                'wb1.ScriptErrorsSuppressed = True
                'wb1.Navigate(v_url)
            ElseIf totalticks >= 30 Then
                wb1.Stop()
                Exit Do
            End If
            'FreeUpMemory()
            Application.DoEvents()
        Loop

我的问题是 Application.DoEvents 需要很长时间才能处理和完成。PS 我正在使用 STA 线程来运行这个 Sub()

4

2 回答 2

1

好的,这里的人是我的问题是如何解决的,感谢其他试图帮助的人!非常感激。好的,这里是:

基本上这两条线在循环中

wb1 = Nothing
wb1 = New Gecko.GeckoWebBrowser

因此,由于某种原因,这使消息队列过于拥挤,因此 application.doevents 处理这些消息的时间太长。因此,我所做的只是将其标记wb1为 gloabl 对象(即dim wb1 as New GeckoWebBrowser),这样我就不需要将其设置为空,然后再次初始化该对象。所以无论如何我删除了上面的两行并使用了实例化的对象。

现在事情运行得如此顺利和快速,即使使用 DoEvents() !耶!!

于 2013-12-20T01:33:41.600 回答
0

尝试使用 BackgroundWorker 而不是在主线程上运行下载。您可以通过传递给 RunWorkerCompleted 事件处理程序的 Result 属性将来自 Backgroundworker 的结果传递回主线程。然后,您不需要循环中的 Application.DoEvents 并且仍然使主线程响应。请参阅此链接以获取教程:

http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx

于 2013-12-19T12:06:21.177 回答