2012-06-19 29 views

回答

-1
Do While wb.ReadyState <> WebBrowserReadyState.Complete 
    Application.DoEvents() 
Loop 
+0

它现在正常工作! :) 谢谢!! – BlackOpty

+2

-1对于没有解释,使用[DoEvents](http://www.codinghorror.com/blog/2004/12/is-doevents-evil.html)和不必要地使用睡眠API –

+0

第一个很好,检查此第二个是不必要的 – nnm

7

这是当我有同样的问题我使用的方法。通过添加处理程序,您不必使用定时器来处理不必要的处理,而是在文档加载后立即触发事件。不要被名称documentcompleted愚弄,它实际上正在等待网页加载。

AddHandler (webbrowser1.DocumentCompleted), AddressOf WebpageLoaded 
webbrowser1.Navigate(url) 

Public Sub WebpageLoaded(sender As System.Object, e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) 
    MessageBox.Show("Done") 
End Sub 

我不是说这是最好的一段路要走,但它的工作很适合我:)

+0

谢谢你正确的做法。今天的新程序员经常使用被接受的答案。 –

0

我继承WebBrowser控件的新类:

Public Class WebBrowserSyncFW 
     Inherits WebBrowser 

     Public Async Function NavigateSync(ByVal urlString As String, Optional ByVal timeoutmillisec As Integer = 30000) As Task(Of Boolean) 
      Dim IsLoaded As Boolean = False 

      Me.ScriptErrorsSuppressed = True 
      Me.Navigate(urlString) 

      AddHandler Me.DocumentCompleted, Sub(sender As Object, e As WebBrowserDocumentCompletedEventArgs) 
               IsLoaded = True 
              End Sub 

      For i = 1 To timeoutmillisec/100 
       Await Task.Delay(100).ConfigureAwait(False) 

       If IsLoaded = True Then Return True 
      Next 

      Return False 
     End Function 

    End Class 

用法:

 If Await WebBrowserSyncFW1.NavigateSync("http://www.youtube.com") Then 
      MsgBox("Page is loaded!", MsgBoxStyle.Information) 
     Else 
      MsgBox("Timeout!", MsgBoxStyle.Exclamation) 
     End If