BackgroundWorker 和 WebBrowser 控件

2023-11-27

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

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

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

是否可以?我可能在某个地方听说过 WebBrowser 控件和线程存在问题。


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

事实上,您可以在另一个线程上运行 WebBrowser,您必须在该线程上创建它的实例。您必须创建一个线程,即所谓的单线程单元。 STA,您可能很容易从 Winforms 或 WPF 应用程序的 Main() 方法上的 [STAThread] 属性中识别出一个缩写词。将工作线程更改为 STA 需要在启动之前调用 Thread.SetApartmentState()。您不能对 BGW 执行此操作。并且线程必须泵送消息循环来实现 STA 合约,它必须调用 Application.Run()。其一,需要让 WebBrowser 引发其事件。这个答案显示方法。

考虑使用 WebRequest 类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BackgroundWorker 和 WebBrowser 控件 的相关文章

随机推荐