在控制台应用程序中使用WebBrowser

时间:2011-06-12 21:31:45

标签: c# multithreading webbrowser-control

我想用它来调用网页上的一些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文档中的一些数据导入主程序? WebBrowser需要一个单独的线程,这需要一个不能返回任何值的静态方法。我如何将doc返回Main(),以便我可以用它做点什么?

2 个答案:

答案 0 :(得分:12)

正确的想法,错误的执行。 WebBrowser.Navigate()仅告知Web浏览器开始导航到您要求的网页。这需要时间,通常为数百毫秒。 Internet Explorer在内部启动线程以完成工作。它通过引发DocumentCompleted事件告诉您何时完成。你不要等待,所以首先崩溃城市。

下一个问题是您的代码中不会引发DocumentCompleted事件。你必须遵守STA合同,它要求你抽一个消息循环。这是一个强大的方式,后台线程,如IE用于检索网页的线程,告诉您的线程该工作已完成。

this answer中提供了所需的样板代码。

答案 1 :(得分:-1)

在您的主要方法上添加[STAThread]。

[STAThread]

static void Main(string[] args)
{

    ...
}