Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Запуск и управление браузером в другом потоке

Автор вопроса: DigitsОтветов: 1

У меня есть основной класс графического интерфейса с некоторыми подклассами. Есть +- 3 потока, которые собирают данные из различных интернет-источников и API-шлюзов и т. д.

Теперь из одного из этих потоков я хочу запустить элемент управления веб-браузером, чтобы добавить в свою программу некоторые функции автоматического просмотра. Каждый из подпотоков должен иметь возможность самостоятельно открывать веб-браузер. Поэтому я создал вторую форму окна С#, которая содержит только элемент управления просмотром веб-страниц.

Я уже использую параметр ApartmentState.STA в этом новом потоке для управления веб-браузером. Однако форма2 не отвечает.

Я попытался вызвать Application.Run(); из этой темы, и это делает веб-браузер/form2 отзывчивым. Но тогда мой основной поток перестает работать.

Поэтому я немного не уверен, как действовать дальше. То, что я хочу, вообще возможно?

  • возможный дубликат WebBrowser Control в новом потоке Hans Passant 21.08.2012

webbrowser-control

Ответы

Ответ 1 · рейтинг 7 · L.B

Это должно работать

var th = new Thread(() =>
{
    WebBrowserDocumentCompletedEventHandler completed = null;

    using (WebBrowser wb = new WebBrowser())
    {
        completed = (sndr, e) =>
        {
            //Do Some work

            wb.DocumentCompleted -= completed;
            Application.ExitThread();
        };

        wb.DocumentCompleted += completed;
        wb.Navigate(url);
        Application.Run();
    }
});

th.SetApartmentState(ApartmentState.STA);
th.Start();
th.Join();

при этом я бы использовал WebClient или HttpWebRequest вместе с HtmlAgilityPack для загрузки и анализа HTML-ресурсов.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы