当前位置:  开发笔记 > 编程语言 > 正文

BackgroundWorker和WebBrowser控件

如何解决《BackgroundWorker和WebBrowser控件》经验,为你挑选了1个好方法。

是否可以/建议在Web浏览器控件中使用后台工作线程?

我正在创建一个搜索谷歌搜索关键字的机器人,然后检查前10页中的网站,看看网站是否排名.

用户最多可以提供20个站点进行检查,并且可以使用代理.理想情况下,我希望一次有5个线程工作.

可能吗?我可能听说过WebBrowser控件和线程存在问题.



1> Hans Passant..:

它不是.WebBrowser使用Internet Explorer,它是一个COM组件.COM组件具有线程模型,IE使用"公寓".这是一个昂贵的词,这意味着它不是线程安全的.您可以在BGW中调用其方法,但COM将自动封送对UI线程的调用.由于所有方法调用和属性访问实际上都发生在UI线程上,因此使用BGW 会使速度变慢.

实际上,您可以在另一个线程上运行WebBrowser,您必须在该线程上创建它的实例.而且你必须创建一个所谓的单线程公寓的线程.STA,您可能从Winforms或WPF应用程序的Main()方法的[STAThread]属性中识别出的首字母缩写词.将工作线程更改为STA需要在启动之前调用Thread.SetApartmentState().你不能为BGW做这件事.并且线程必须通过消息循环来实现STA合同,它必须调用Application.Run().例如,要求WebBrowser引发其事件. 这个答案显示了这种方法.

考虑使用WebRequest类.


我在搜索是否可以在UI线程上使用`WebBrowser.Navigate()`****时遇到了这个答案.我从你的问题中理解是的,它是可能的,但这并不重要,因为所有这些调用都被编组到UI线程.我能正确理解吗?
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有