2013-12-19 239 views
0

我有亚健康()这样的,使用GeckoWebBrowserApplication.DoEvents需要很长的时间

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需要很长的时间来处理和完成下载HTML页面。 P.S我使用STA线程来运行这个子()

+0

我没有看到这里的DoEvents有关的任何时刻码。你如何确定所花费的时间? –

+0

丹O,application.doevents前的“totalticks” varible是像3后,它像800,有时更 – user2280232

回答

0

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

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

+0

以及整个子从STA线程跑,如果我删除application.doevents DocumentComplete事件永远不会触发 – user2280232

1

这里好了的人是我的问题是如何解决的,并感谢谁试图帮助别人!非常感激。确定这里有云:

基本上这2条线,其中在环

wb1 = Nothing 
wb1 = New Gecko.GeckoWebBrowser 

因此,这出于某种原因正在作出的邮件队列太拥挤therfore的application.doevents时间太长来处理这些邮件。 所以我所做的只是decalring wb1为gloabl对象(即dim wb1 as New GeckoWebBrowser)这种方式,我没有需要将其设置为无,然后重新初始化的对象。所以无论如何,我删除了上述2行,并使用实例化的对象。

现在运行的东西,所以顺利和快速,即使调用DoEvents()!好极了!!

+0

耶在大多数性能编程书籍中,编号为1的规则永远不会在循环中放入“NEW”语句。和平。 – hamish