Использование WebBrowser в консольном приложении - PullRequest
14 голосов
/ 13 июня 2011

Я хочу использовать его для вызова некоторых 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(), чтобы я мог что-то с этим сделать?

1 Ответ

12 голосов
/ 13 июня 2011

Правильная идея, неправильное исполнение.WebBrowser.Navigate () только сообщает веб-браузеру начать переход на запрашиваемую веб-страницу.Это обычно занимает сотни миллисекунд.Internet Explorer внутренне запускает потоки, чтобы выполнить работу.Он сообщает вам, когда это сделано, вызывая событие DocumentCompleted.Вы не ждете этого, так что это сначала город аварий.

Следующая проблема заключается в том, что событие DocumentCompleted не будет вызываться в вашем коде.Вы должны соблюдать контракт STA, он требует прокачки цикла сообщений.Это всемогущий способ, которым фоновый поток, такой как тот, который IE использует для извлечения веб-страницы, сообщает вашему потоку, что работа выполнена.

Стандартный код, который вам нужендоступно в этот ответ .

...