在控制台应用程序中使用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用来检索网页的后台线程)告诉您的线程该工作已完成的全能方式。 您需要的样板代码可在此答案中找到。