如何解决在控制台应用程序中使用WebBrowser
| 我想用它来调用网页上的一些JS脚本。我有这个: static void Stuff()
{
WebBrowser browser = new WebBrowser();
browser.Navigate(\"http://www.iana.org/domains/example/\");
HtmlDocument doc = browser.Document;
//doc.InvokeScript(\"someScript\");
Console.WriteLine(doc.ToString());
}
static void Main(string[] args)
{
Console.WriteLine(\"hi\");
var t = new Thread(Stuff);
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
问题1:尝试获取doc.ToString()
时,出现“对象引用未设置”异常。为什么?
问题2:如何从HTML文档中获取一些数据到主程序中? “ 2”需要一个单独的线程,该线程需要一个不能返回任何值的静态方法。我该如何将doc
退还给Main()
,以便我可以做些什么?
解决方法
正确的想法,错误的执行。 WebBrowser.Navigate()仅告诉Web浏览器开始导航到您要求的网页。这需要花费时间,通常为几百毫秒。 Internet Explorer在内部启动线程以完成任务。通过引发DocumentCompleted事件,它告诉您何时完成操作。您不必等待,这样就可以让崩溃的城市首当其冲。
下一个问题是在代码中不会引发DocumentCompleted事件。您必须履行STA合同,这要求您启动消息循环。这就是后台线程(如IE用来检索网页的后台线程)告诉您的线程该工作已完成的全能方式。
您需要的样板代码可在此答案中找到。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。