问题描述
|
我想用它来调用网页上的一些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用来检索网页的后台线程)告诉您的线程该工作已完成的全能方式。
您需要的样板代码可在此答案中找到。