У меня есть элемент управления WebBrowser, который динамически создается из фонового потока STA, потому что родительский поток является BackgroundWorker и имеет много других дел.
Проблема в том, что событие Navigated никогда не срабатывает, если только я не вставлю MessageBox.Show () в метод, который сообщил об этом .Navigate (). Я объясню:
ThreadStart ts = new ThreadStart(GetLandingPageContent_ChildThread);
Thread t = new Thread(ts);
t.SetApartmentState(ApartmentState.STA);
t.Name = "Mailbox Processor";
t.Start();
protected void GetLandingPageContent_ChildThread()
{
WebBrowser wb = new WebBrowser();
wb.Navigated += new WebBrowserNavigatedEventHandler(wb_Navigated);
wb.Navigate(_url);
MessageBox.Show("W00t");
}
protected void wb_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
WebBrowser wb = (WebBrowser)sender; // Breakpoint
HtmlDocument hDoc = wb.Document;
}
Это отлично работает; но окно сообщения будет мешать, так как это приложение для автоматизации. Когда я удаляю MessageBox.Show (), событие WebBrowser.Navigated никогда не запускается. Я попытался вытеснить эту строку с помощью Thread.Sleep () и приостановить родительский поток.
Как только я это уйду, я намереваюсь приостановить родительский поток, пока WebBrowser выполняет свою работу, и найти какой-то способ передачи полученного HTML-кода обратно в родительский поток, чтобы он мог продолжить дальнейшую логику.
Почему это происходит? Как я могу это исправить?
Если кто-то может предоставить мне способ извлечь содержимое веб-страницы, заполнить некоторые данные и вернуть содержимое страницы на другой стороне кнопки отправки, все против веб-сервера, который не поддерживает Глаголы POST и передача данных через QueryString. Я также приму этот ответ, поскольку все это упражнение будет излишним.
Решение: В итоге я просто не использовал BackgroundWorker и подчиненный поток по предложению архитектора команды ... Хотя за счет отзывчивости: (