【问题标题】:Using Webbrowser with Control.invoke将 Webbrowser 与 Control.invoke 一起使用
【发布时间】:2011-03-28 20:12:34
【问题描述】:

我正在开发一个用于网页抓取的 Windows 应用程序。为此,我使用 Webbrowser 控件 - 我不能使用 webrequest/webclient/webresponse 类,因为网页是使用 javascript 动态加载的。
该应用程序工作正常,但由于我做了很多处理,它不必要地加载 UI。我间歇性地收到“未响应”消息。所以我所做的是:

1.在UI线程上创建webbrowser
2. 将长时间运行的进程置于后台线程
3. 每当我需要获取页面文档时,我都会使用 Control.Invoke。
4. 通过invoke调用后台线程返回页面的文档

在回调函数中,我可以看到页面的文档被提取得很好。但是,返回给后台工作人员的文档 (HtmlDocument) 未正确评估。当我单步调试调试器时,我收到“函数评估超时消息...”。我玩弄了语法并不断收到无效的强制转换异常或跨线程消息传递异常。
以下是我编写回调/委托的方式:

private delegate HtmlDocument RefreshDelegate(); 
private HtmlDocument RefreshBrowser()
    {
        WebBrowser br1 = ((WebBrowser)this.Controls["br1"]); //get webbrowser, "br1"
        br1.Refresh(); //refresh browser
        return br1.Document; //is retrieved correctly
   }


现在对于处理“返回”HTMLDocument 的后台工作程序中的代码:

WebBrowser br1 = ((WebBrowser)this.Controls["br1"]); //get the browser
HtmlDocument document = (HtmlDocument)br1.Invoke(new RefreshDelegate(this.RefreshBrowser));  //not evaluated 
//do stuff with document


遇到调试器消息:“函数评估已禁用,因为之前的函数评估超时。您必须继续执行才能重新启用函数评估。”。这是解决这个问题的正确方法吗?正如我所说,我无法通过 webrequest 等获取 javascript 内容,我也无法在 UI 上运行 htmldocument 解析,因为它会导致糟糕的用户体验。此外,碰巧我需要创建几个 webbrowser 实例。如果这不是最好的方法,我也对其他图书馆开放。谢谢。

【问题讨论】:

    标签: c# browser backgroundworker invoke


    【解决方案1】:

    发生这种情况是因为您在工作线程或调试器线程中调用的 WebBrowser 方法实际上并未在该线程上运行。 WebBrowser 是一个单元线程 COM 组件,COM 自动将工作线程的调用编组回 UI 线程。这在调试器中效果不佳,因为 UI 线程被调试器冻结。

    对此您无能为力,实际上让这些调用在 UI 线程上运行仍然会使您面临 UI 冻结。唯一的解决方法是在自己的 STA 线程上完全关闭浏览器。你不能看它,不应该是我想象的问题。检查this answer 获取您需要的代码。

    【讨论】:

    • 成功了!!你刚刚为我节省了数小时的漫无目的的调试。我认为重要的部分是将公寓状态设置为 STA。非常感谢:)
    【解决方案2】:

    我建议使用 HtmlAgilityPack。这是专门为网页“抓取”而设计的。

    http://htmlagilitypack.codeplex.com/

    【讨论】:

    • 不,它不运行 javascript。但是你可以使用jint.codeplex.com 来运行javascript。
    • 我在使用浏览器之前实际上使用了htmlagility pack。我特别喜欢如何使用 xpath 提取元素。我拥有的表单将脚本(我相信是 jquery)存储在 .js 文件中。所以javascript调用是“不可见的”。 jint.codeplex 可以在这种情况下工作吗?
    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 2016-03-13
    • 2010-09-15
    • 1970-01-01
    • 2015-09-30
    • 2014-03-23
    • 2011-07-04
    • 2011-06-29
    相关资源
    最近更新 更多