我有这样的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需要很长时间才能处理完成。 P.S我正在使用STA线程来运行这个Sub()
答案 0 :(得分:1)
好的人在这里是我的问题如何解决,并感谢其他人试图帮助!非常感激。好的,这就是:
基本上这2行在循环中
wb1 = Nothing
wb1 = New Gecko.GeckoWebBrowser
因此,出于某种原因,使得消息队列过于拥挤,因此application.doevents处理这些消息的时间太长。
所以我所做的就是将wb1
作为gloabl对象(即dim wb1 as New GeckoWebBrowser
)进行decalring,这样我就不需要将其设置为空,然后再次初始化对象。所以无论如何我删除了上面的两行并改为使用了instaniated对象。
现在运行如此顺畅和快速,即使使用DoEvents()! YAY !!
答案 1 :(得分:0)
尝试使用BackgroundWorker而不是在主线程上运行Download。您可以通过Result属性将Backgroundworker的结果传递回Main主题,该属性将传递给RunWorkerCompleted事件处理程序。您不需要循环中的Application.DoEvents,仍然可以响应主线程。 请参阅此链接以获取教程:
http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx