我一直在努力寻找一个好的标题,因为我已经解决了我的问题。我只需要说明我如何解决这个问题......因为我正在潜入我刚才发现的东西,现在对我来说可能并不清楚。WebBrowser在BackgroundWorker中的STAThread内导航了解
因此,为了恢复我的问题解决方案,这里是我解决问题的方式,以及我不明白的地方。
我正在设计一个WindowsForm应用程序,它抓取到网站以检索一些数据。我有几个不同的网站可以抓取,每个网站都有所不同。我使用的基本方式是使用WebRequest。然而,一个网站迫使我模拟点击,所以对于这个特定的网站,我使用WebBrowser控件来调用特定的javascript函数。
我决定离开主线程进行一些爬行工作,因为它非常耗时并且冻结了我的应用程序。
我用来做这件事的方式是每个搜索方法的BackgroundWorker(每个网站一个)。除了使用WebBrowser的网站之外,它适用于每个网站。我遇到了一个异常:“无法获取'WebBrowser'控件的窗口句柄,不支持Windowless ActiveX控件。”
我在网上发现我无法使用WebBrowser控件,因为我不在WebBrowser的构建线程中。我决定在BackgroundWorker的DoWork方法中创建一个封装WebBrowser的Form,而不是原始Form,并为此WebBrowser调用Navigate()方法。
它也没有工作,具有相同的例外。我发现这个答案(http://stackoverflow.com/questions/4269800/webbrowser-control-in-a-new-thread),它帮助了我很多(我改变了一点点的代码答案让它工作作为它是面向问题)
所以现在:
我点击一个按钮,它会创建一个BackgroundWorker。 在BackgroundWorker中,调用launchSearch方法。 在这个launchSearch方法中,我创建了一个新线程,它正在完成我所需要的所有工作(此线程的创建方式与上面链接的解决方案非常相似),并将“hasActiveThread”布尔值设置为true,同时该线程尚未完成工作。 工作完成后,我得到结果并释放我的BackgroundWorker。
什么打扰我是,我不明白为什么在我的BackgroundWorker“DoWork”方法中创建一个窗体在尝试导航到一个url时无法正常工作。如果你至少可以帮助我理解为什么解决方案必须是“复杂”的,并且背后的原因,我会非常感谢!
Al_th
感谢您的支持:) – 2012-07-27 13:34:52