WebBrowser.Navigated Только Запускается, когда я MessageBox.Show (); - PullRequest
0 голосов
/ 15 декабря 2008

У меня есть элемент управления 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 и подчиненный поток по предложению архитектора команды ... Хотя за счет отзывчивости: (

Ответы [ 6 ]

2 голосов
/ 15 декабря 2008

WebBrowser ничего не сделает, если он не показан и имеет связанный поток пользовательского интерфейса; вы показываете форму, в которой он находится? Вам нужно, чтобы использовать DOM и т. Д. Форма может быть за кадром, если вы не хотите отображать ее пользователю, но она не будет хорошо работать в службе (например).

В целях очистки вы можете обычно моделировать обычный браузер HTML, используя WebClient и т. Д. Разве этого недостаточно? Вы можете использовать такие инструменты, как " Fiddler ", чтобы выяснить точный запрос, который вы должны сделать на сервер. Более того, вы можете взглянуть на HTML Agility Pack , который предлагает доступ DOM к HTML без браузера.

1 голос
/ 29 мая 2010

вам нужно добавить строку, подобную этой:

webBrowser1.Navigated += new WebBrowserNavigatedEventHandler(webBrowser1_Navigated);

, где webBrowswer1_Navigated - функция, которую вы хотите вызвать при возникновении события.

1 голос
/ 16 декабря 2008

События Navigated и DocumentComplete не будут срабатывать, если для видимости веб-браузера установлено значение false. Вы можете обойти это ограничение, сделав WebBrowser видимым, но установив его местоположение так, чтобы оно находилось вне пользовательского интерфейса, например:

wb.Visible = true;
wb.Left = -wb.Width; // notice the minus sign
0 голосов
/ 02 мая 2012

Элемент управления WebBrowser не может работать, если он не находится в потоке STA. Если вы хотите использовать экземпляр WebBrowser в потоке, вам нужно создать свой поток и вызвать Thread.SetApartmentState(ApartmentState.STA);

0 голосов
/ 16 декабря 2008

В итоге я просто не использовал BackgroundWorker и подчиненный поток по предложению архитектора команды ... Хотя за счет отзывчивости :(

0 голосов
/ 15 декабря 2008

Есть ли уже запущенный поток графического интерфейса? Возможно, объект WebBrowser использует поток GUI для обработки событий. В этом случае вы должны вызвать Application.Run () из потока, который создает WebBrowser (замените ваш MessageBox.Show () на этот) Application.Run () будет зависать до тех пор, пока не будет вызван Application.Exit ().

Попытка проверить это сейчас.

...