是否可以/建议将后台工作线程与 Web 浏览器控件一起使用?
我正在创建一个在 google 中搜索关键字的机器人,然后检查前 10 页中的网站以查看网站是否排名。
用户最多可以提供 20 个站点进行检查,并且可以使用代理。所以理想情况下,我希望有 5 个线程同时工作。
这可能吗?我可能在某处听说 WebBrowser 控件和线程存在问题。
最佳答案
事实并非如此。 WebBrowser 使用 Internet Explorer,这是一个 COM 组件。 COM组件有一个线程模型,IE使用“Apartment”。这是一个昂贵的词,意味着它不是线程安全的。您可以在 BGW 中调用它的方法,但 COM 会自动将调用编码到 UI 线程。由于所有方法调用和属性访问实际上都发生在 UI 线程上,因此您可以通过使用 BGW 使其变慢。
您实际上可以在另一个线程上运行 WebBrowser,您必须在该线程上创建它的一个实例。并且您将必须创建一个线程,即所谓的单线程单元。 STA,您可能会从 Winforms 或 WPF 应用程序的 Main() 方法的 [STAThread] 属性中认出一个首字母缩写词。将工作线程更改为 STA 需要在启动之前调用 Thread.SetApartmentState()。您不能为 BGW 执行此操作。并且线程必须泵出一个消息循环来实现 STA 契约,它必须调用 Application.Run()。一方面,需要让 WebBrowser 引发其事件。 This answer展示了方法。
考虑使用 WebRequest 类。
关于c# - BackgroundWorker 和 WebBrowser 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2491236/