是否可以在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' 无法实例化,因为 当前线程不在 单线程公寓。
有没有人知道创建后台WebBrowser的方法?我想这样做是为了从网站中提取信息然后吐出各种HTML DOM数组
答案 0 :(得分:1)
在线程启动之前设置线程的appartment状态:
myThread.IsBackground = false;
myThread.SetApartmentState(ApartmentState.STA);
myThread.Start();
答案 1 :(得分:0)
Webbrowser运行的线程必须是ApartmentState。STA。从BackgroundWorker线程中,您必须在UI对象上使用Invoke并在该上下文中添加Webbrowser。
我认为你真的不需要在后台线程中运行WebBrowser对象。它的所有功能都与事件异步处理。
答案 2 :(得分:0)
您还可以编写一个包装类,它实例化Web浏览器控件,创建包装提取函数的方法,并通过公共事件触发结果。
从这里开始创建包装器的新实例,并将其添加到ThreadPool中。
请记住执行正确的所有者线程调用以避免跨线程异常;)
答案 3 :(得分:0)
在两条道路上,我会推荐WatiN,一个自动化IE和Firefox的开源库。 WebBrowser控件适用于显示内容,但对于任何更复杂的内容,它都会变得很麻烦。