从后台线程vb.net操作运行时webbrowser控件

时间:2013-11-11 13:41:26

标签: vb.net multithreading winforms activex webbrowser-control

我正试图在一些后台线程中使用一堆webbrowsers。当我使用我在设计视图中放置在窗体上的webbrowser控件但现在在运行时创建它们时,这没有问题。

我全局声明了webbrowsers数组:

Dim webbroswers(-1) As WebBrowser

以下代码在主线程上:

ReDim Preserve webbroswers(somenum)

  For i = 0 To sumnum

            webbroswers(currentbrowsermax + i) = New WebBrowser

  Next

然后此代码在后台线程上运行:

If webbroswers(num).InvokeRequired Then
    webbroswers(num).Invoke(Sub() webbroswers(num).Navigate(someurl))
Else
    webbroswers(num).Invoke(Sub() webbroswers(num).Navigate(someurl))

此时程序崩溃并出现以下错误:

  

无法获取“WebBrowser”控件的窗口句柄。不支持无窗口ActiveX控件。

对此的任何帮助都会很棒。此外,如果有人知道如何抑制脚本错误,那么我认为这可能会有所帮助。我试过了:WebBrowser(num).ScriptErrorsSuppressed = True但这不起作用(在主线程上运行时,我的代码中的其他地方也不起作用)谢谢!

1 个答案:

答案 0 :(得分:1)

Control.InvokeRequired和Invoke成员使用Handle属性来确定哪个线程拥有该控件。问题是,对于您创建的Web浏览器,句柄为空。当控件在窗体上可见时,控件只有一个有效的句柄。你没做的。然后它将尝试创建句柄,但这是一个失败的鲸鱼,像WebBrowser这样的ActiveX控件需要一个有效的Parent。没有Me.Control.Add(),就像你原来的版本一样,它没有。

解决方法很简单,您只需要另一个具有有效Handle属性的控件。任何人都会这样做,它只关心拥有句柄的线程,而不是句柄的值。

你有一个:你的表格。请改用Me.InvokeRequiredMe.Invoke()。或者Application.OpenForms(0)如果你不能轻易获得对表单对象的引用,最好避免使用。