【问题标题】:Run and control browser control in different thread在不同的线程中运行和控制浏览器控件
【发布时间】:2012-08-17 02:05:43
【问题描述】:

我有我的主要 gui 类和一些子类。有 +- 3 个线程正在从各种互联网资源和 API 网关等收集数据。

现在,在其中一个线程中,我想运行一个网络浏览器控件,这样我就可以在我的程序中添加一些自动浏览功能。每个子线程都应该能够自行打开网络浏览器。所以我创建了第二个 c# windows 窗体,它只包含 webbrowsing 控件。

我已经在这个新线程上为 webbrowser 控件使用了 ApartmentState.STA 设置。但是,form2 没有响应。

我试图调用 Application.Run();从这个线程,这使得 webbrowser/form2 响应。但随后我的主线程停止运行。

所以我有点不确定如何继续。我想要的有可能吗?

【问题讨论】:

标签: c# webbrowser-control


【解决方案1】:

这应该可行

var th = new Thread(() =>
{
    WebBrowserDocumentCompletedEventHandler completed = null;

    using (WebBrowser wb = new WebBrowser())
    {
        completed = (sndr, e) =>
        {
            //Do Some work

            wb.DocumentCompleted -= completed;
            Application.ExitThread();
        };

        wb.DocumentCompleted += completed;
        wb.Navigate(url);
        Application.Run();
    }
});

th.SetApartmentState(ApartmentState.STA);
th.Start();
th.Join();

也就是说,我会使用WebClientHttpWebRequestHtmlAgilityPack 一起下载和解析html 资源

【讨论】:

  • 谢谢。我会试试这个。这不仅仅是下载内容,我还需要自动选择某些按钮并单击它们等。那么 WebClient 仍然可取吗?
  • Selenium 效果很好。唯一的缺点是你需要运行一个 java 服务器组件并且你有一些烦人的命令提示符窗口......但它可以工作:)
  • 上面的答案也有效,但是当我需要浏览到一个页面、输入数据、单击一个按钮、浏览到另一个页面、搜索数据等时它会变得有点麻烦。dcoumentCompleted 事件给出那我就头疼了。
  • 你是上帝。花了一整天的时间。
  • 用这个也可以执行javascript吗?
猜你喜欢
  • 2017-12-10
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2019-12-17
  • 1970-01-01
相关资源
最近更新 更多