2013-12-19 7 views
0

я есть s Sub(), как это, чтобы загрузить HTML-страницу с помощью 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 занимает много времени, чтобы обработать и закончить. P.S Я использую поток STA для запуска этого Sub()

+0

Я не вижу никакого кода времени, связанного с событиями здесь. Как вы определили, сколько времени потребуется? –

+0

Dan o, «totalticks» varible до application.doevents - это что-то вроде 3 после того, как это похоже на 800, а иногда и больше – user2280232

ответ

0

Попробуйте использовать BackgroundWorker вместо запуска загрузки в основном потоке. Вы можете передать результаты из Backgroundworker обратно в основной поток через свойство Result, которое передается обработчику события RunWorkerCompleted. Вам не нужно Application.DoEvents в вашем цикле, и все еще будет реагировать на основной поток. Смотрите эту ссылку для учебника:

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

+0

, а вся суб-побега из потока STA, если я удалю application.doevents, событие documentcomplete никогда не срабатывает – user2280232

1

Ok люди вот как моя проблема была решена, и спасибо за другие, которые пытались помочь! очень признателен. Хорошо здесь идет:

В основном это 2 линии, где в цикле

wb1 = Nothing 
wb1 = New Gecko.GeckoWebBrowser 

Так что это по какой-то причине было делать сообщения в очереди слишком тесно Therfore в Application.DoEvents занимает слишком много времени, чтобы обработать эти сообщения. Итак, все, что я сделал, было decalring wb1 как объект gloabl (то есть dim wb1 as New GeckoWebBrowser) таким образом мне не нужно было устанавливать его ни к чему, а затем снова инициализировать объект. Так что в любом случае я удалил вышеуказанные 2 строки и вместо этого использовал объект instaniated.

Теперь все работает так гладко и быстро, даже с DoEvents() !!! УРА!!

+0

да номер 1 в большинстве книг по программированию производительности, никогда не ставьте в цикл цикл «NEW». мир. – hamish

Смежные вопросы