c# - BackgroundWorker 和 WebBrowser 控件

标签 c#

是否可以/建议将后台工作线程与 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/

相关文章:

c# - 如何使用集合来存储委托(delegate)?

c# - Xero oAuth 2 授权

c# - 由于意外字符串 (WCF + JSON),WCF 响应无效

c# - 如何更改 Microsoft C# 编译器错误消息的语言?

c# - 如何保存上传的文件?由 c#mvc

c# - Intellisense 未显示代码隐藏中的新控件

c# - 从列表中获取新创建的对象

c# - 使用 Entity Framework Core 访问 MySql

c# - 拆箱到更大的值类型

c# - MVVM C#​​ 如何将异步数据加载到属性中?