【发布时间】: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