WebBrowser.IsBusy或ReadyState(VB.NET)的InvalidCastException无效

WebBrowser.IsBusy或ReadyState(VB.NET)的InvalidCastException无效,vb.net,browser,Vb.net,Browser,我在玩弄作为我另一个问题答案的方法(),发现了一些奇怪的东西 上述问题的答案是使用一系列javascript调用作为URL来填写web表单并提交它。我一直试图在VB.NET程序中自动执行此操作,但没有成功 我给出的原始示例不起作用,可能是因为您正在等待与WebBrowser控件工作的线程相同的线程: WebBrowser1.Navigate("http://www.google.com") Do While WebBrowser1.IsBusy OrElse WebBrowser1.ReadyS

我在玩弄作为我另一个问题答案的方法(),发现了一些奇怪的东西

上述问题的答案是使用一系列javascript调用作为URL来填写web表单并提交它。我一直试图在VB.NET程序中自动执行此操作,但没有成功

我给出的原始示例不起作用,可能是因为您正在等待与WebBrowser控件工作的线程相同的线程:

WebBrowser1.Navigate("http://www.google.com")
Do While WebBrowser1.IsBusy OrElse WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
    Threading.Thread.Sleep(1000)
Application.DoEvents()
Loop
WebBrowser1.Navigate("javascript:function%20f(){document.forms[0]['q'].value='stackoverflow';}f();")
Threading.Thread.Sleep(2000) 'wait for javascript to run
WebBrowser1.Navigate("javascript:document.forms[0].submit()")
Threading.Thread.Sleep(2000) 'wait for javascript to run
奇怪的是,在等待循环中检查ReadyState(或者说IsBusy)有时会抛出一个InvalidCastException。对它们的调用可能不是线程安全的?我不知道。如果我将有问题的调用放在Try块中,等待循环就会失败。事实上,异常似乎“持续”地将一切都搞砸了,因为即使使用try块遍历代码,visualstudio也会冻结10到20秒(没有try块也会冻结)

有什么想法吗?

下面的文章:“在一个控件上有四个线程安全的方法可以调用:Invoke、BeginInvoke、EndInvoke和CreateGraphics以及InvokeRequired属性”

因此,在子等待中调用WebBrowser1.ReadyState不是线程安全的

我经历过的最有趣的问题之一,对我来说 无法在inet中找到解决方案-问题是否与有关 网络浏览器控制。问题是当我试图访问 WebBrowser控件实例的Document属性,我正在获取 “无效的强制转换异常”。问题是WebBrowser控件 设计为在一个线程中工作。因此,要解决此问题,您只需检查 InvokeRequired属性,如果其值为true,则调用逻辑 从委托,输入browser.Invoke(…)方法

 Private Delegate Sub SetTextDelegate(ByVal TheText As String)
 Private Sub delSetText(ByVal TheText As String)
     WebBrowser1.Navigate(TheText)
 End Sub

 Private Sub BrowseTo(ByVal URL As String)
     If WebBrowser1.InvokeRequired Then
         Me.BeginInvoke(New SetTextDelegate(AddressOf delSetText), URL)
     Else
         WebBrowser1.Navigate(URL)
     End If
 End Sub

 Private Sub TargetURL()
   BrowseTo("http://www.google.com")
 End Sub

 Private Sub TypeSomethingIn()
     BrowseTo("javascript:function%20f(){document.forms[0]['g'].value='test';}f();")
 End Sub

 Private Sub SubmitForm()
     BrowseTo("javascript:document.forms[0].submit()")
 End Sub

 Private Sub Wait()
     While True
         If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then Exit Sub
         Threading.Thread.Sleep(100)
     End While
 End Sub

 Private Sub AutoBrowse()
     TargetURL()
     Wait()
     TypeSomethingIn()
     Wait()
     SubmitForm()
 End Sub

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     Dim t As Threading.Thread
     t = New Threading.Thread(AddressOf AutoBrowse)
     t.Start()
 End Sub