Vb.net 在backgroundworker的后台线程中创建webbrowser控件

Vb.net 在backgroundworker的后台线程中创建webbrowser控件,vb.net,webbrowser-control,Vb.net,Webbrowser Control,是否可以在BackgroundWorker的后台线程中创建WebBrowser控件 Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Using web1 As New WebBrowser End Using End Sub

是否可以在BackgroundWorker的后台线程中创建WebBrowser控件

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Using web1 As New WebBrowser

    End Using
End Sub
这会引发以下错误:

ActiveX控件 “8856f961-340a-11d0-a96b-00c04fd705a2” 无法实例化,因为 当前线程不在 单线程公寓


有人知道创建背景网络浏览器的方法吗?我想这样做是为了从网站中提取信息,然后吐出各种HTML DOM数组

Webbrowser运行的线程必须是.STA。从BackgroundWorker线程,您必须对UI对象使用Invoke,并在该上下文中添加Webbrowser


我不认为您真的需要在后台线程中运行WebBrowser对象。它的所有功能都是通过事件异步处理的

您还可以编写一个包装类,用于实例化web浏览器控件,创建包装提取函数的方法,并通过公共事件触发结果

从这里,您只需创建包装器的一个新实例,并将其添加到线程池中


请记住执行正确的所有者线程调用以避免跨线程异常;)

经过这两方面的努力,我推荐一个开源库来自动化IE和Firefox。WebBrowser控件适合显示内容,但对于任何更复杂的内容,它都会成为一个大麻烦。

在线程启动之前设置线程的安装状态:

myThread.IsBackground = false;
myThread.SetApartmentState(ApartmentState.STA);
myThread.Start();

我不想在表单中添加webbrowser,而是将其作为类加载,并使用其dom函数从网站中提取信息,最终目标是将htmldocument对象传递到backgroundworker结果对象OK。然后,不要使用BackgroundWorker,而是创建一个真正的线程并使用.SetApartmentState(ApartmentState.STA)。这可能行得通。我做过很多类似的工作,并发现用这种方法做任何事情都会带来巨大的痛苦。WB控制太脆弱了。当以这种方式自动化时,它会崩溃、显示模式对话框、返回空白页以及许多其他问题。我下载了原始html并用majestic()对其进行了解析。从长远来看,这可能会快1000倍,可靠性也会大大提高。hmm不要试图只显示内容,而是在jscript客户端操作完好无损的情况下提取dom元素,例如,如果jscript在页面加载时更改了图像,我希望得到可以在程序中操作的HTML文档和dom结构,我想我可以用网络浏览器逃跑。我没想到线程问题会拖慢我的进度。现在我一直在思考如何让线程做一些有用的事情,因为我现在不了解线程构造函数,也不习惯于后台工作