C# WebBrowser在后台工作人员理解范围内的StatThread内导航

C# WebBrowser在后台工作人员理解范围内的StatThread内导航,c#,winforms,browser,backgroundworker,sta,C#,Winforms,Browser,Backgroundworker,Sta,我正在努力寻找一个好的标题,因为我已经解决了我的问题。我只需要解释一下我是如何解决的。。。因为我正在钻研我今天刚刚发现的东西,现在对我来说可能还不清楚 因此,为了恢复我的问题解决,这里是我解决问题的方式,我不明白的是 我正在设计一个WindowsForm应用程序,它可以爬入网站以检索一些数据。我有几个不同的网站爬进去,每个都是不同的。我使用的基本方法是使用WebRequest。然而,有一个网站强迫我模拟点击,所以对于这个特定的网站,我使用WebBrowser控件来调用特定的javascript函

我正在努力寻找一个好的标题,因为我已经解决了我的问题。我只需要解释一下我是如何解决的。。。因为我正在钻研我今天刚刚发现的东西,现在对我来说可能还不清楚

因此,为了恢复我的问题解决,这里是我解决问题的方式,我不明白的是

我正在设计一个WindowsForm应用程序,它可以爬入网站以检索一些数据。我有几个不同的网站爬进去,每个都是不同的。我使用的基本方法是使用WebRequest。然而,有一个网站强迫我模拟点击,所以对于这个特定的网站,我使用WebBrowser控件来调用特定的javascript函数

我决定退出主线程,做一些爬行工作,因为这非常耗时,并且冻结了我的应用程序

我过去的做法是每个搜索方法都有一个后台工作人员(每个网站一个)。它适用于除WebBrowser之外的所有网站。我遇到一个异常:“无法获取“WebBrowser”控件的窗口句柄。不支持无窗口ActiveX控件。”

我在网上发现我不能使用WebBrowser控件,因为我不在构建WebBrowser的线程中。我决定在BackgroundWorker的DoWork方法中创建一个包装WebBrowser的表单,而不是原始表单,并为此WebBrowser调用Navigate()方法

它也不起作用,只有一个例外。我找到了这个答案(http://stackoverflow.com/questions/4269800/webbrowser-control-in-a-new-thread)这对我帮助很大(我对代码的答案部分做了一点修改,使其能够正常工作,因为它是面向问题的)

所以现在:

我点击一个按钮,它会创建一个BackgroundWorker。 在BackgroundWorker内部,调用launchSearch方法。 在这个launchSearch方法中,我创建了一个新线程,它正在完成我需要的所有工作(这个线程的创建方式与我上面链接的解决方案基本相同),并且在线程尚未完成工作时,我将“hasActiveThread”布尔值设置为true。 当工作完成后,我得到结果并释放我的BackgroundWorker

让我烦恼的是,我真的不明白为什么在BackgroundWorker“DoWork”方法中创建表单在尝试导航到url时不能正常工作。如果你能至少帮助我理解为什么解决方案会如此“复杂”,以及背后的原因,我将非常感谢


因为BackgroundWorked运行的所有新线程都是在没有运行消息循环的情况下启动的,所以您的解决方案没有运行。任何用户交互操作都通过Windows消息机制工作。有关详细信息,请参阅和。表单对象的简单创建不会初始化消息循环。要运行它,您可以调用Form.Show或Form.ShowDialog方法,或Application.Run(…)方法。在工作示例中,消息循环是用Application.Run()方法启动的