2012-07-27 62 views
0

我一直在努力寻找一个好的标题,因为我已经解决了我的问题。我只需要说明我如何解决这个问题......因为我正在潜入我刚才发现的东西,现在对我来说可能并不清楚。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

回答

2

因为BackgroundWorked所有正在运行的新主题是不运行消息循环开始你的溶液没有奏效。任何用户交互操作都可以通过Windows消息机制实现有关详细信息,请参阅http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windowshttp://msdn.microsoft.com/en-us/library/windows/desktop/ms644928%28v=vs.85%29.aspx。 Form对象的简单创建不会初始化消息循环。为了运行它,您可以调用Form.Show或Form.ShowDialog方法或Application.Run(...)方法。在工作示例中,消息循环以Application.Run()方法启动。

+0

感谢您的支持:) – 2012-07-27 13:34:52