Как долго я должен ждать, чтобы что-то сделать после вызова WebBrowser.Refresh?

У меня есть веб-страница, из которой я вырезаю элементы для использования в программе, которую пишу. Загрузка определенного элемента на веб-страницу занимает некоторое время, поэтому я подумал, что буду использовать WebBrowser.Refresh(), чтобы получить обновленный код. К сожалению, это вызывает много головной боли, если вы хотите сделать ЧТО-НИБУДЬ впоследствии, поскольку оно не запускает событие DocumentCompleted (прежде чем кто-либо спросит, это даже прямо говорится об этом в MSDN).

Поэтому мне нужен метод, позволяющий программе ничего не делать в течение 2 секунд после обновления страницы. Проблема в том, что я не знаю, как это сделать и получить обновленный WebBrowser.Document. Если я использую Thread.Sleep, все приложение зависает, пока оно спит, и ничего не обновляется.

И если я сразу попытаюсь, я неизменно столкнусь с дрянной дрянной проблемой объекта WebBrowser, зависающего навсегда или выбрасывающего исключения Null Cast.

У кого-нибудь еще была такая проблема (или что-то подобное) и нашел решение?


person Will    schedule 29.01.2013    source источник
comment
WebBrowser.IsBusy не работает? Кроме того, как насчет WebBrowser.ReadyState?   -  person FlyingStreudel    schedule 30.01.2013
comment
Нет и нет. Оба они не выполняются по какой-то причине. IsBusy выдает Null Cast, как и ReadyState.   -  person Will    schedule 30.01.2013
comment
Что вы имеете в виду, что они бросают нулевое приведение? Просто доступ к ним бросает его? Кроме того, причина, по которой ваше приложение зависает, когда вы спите, заключается в том, что вы спите в потоке пользовательского интерфейса. Вам нужно заснуть в каком-то фоновом потоке и уведомить поток пользовательского интерфейса, когда он будет готов.   -  person FlyingStreudel    schedule 30.01.2013
comment
Я имею в виду, что когда я перехожу в режим отладки, каждый параметр, метод и все, что у вас есть в элементе управления веб-браузером, имеет красный цвет! рядом с ним и говорит, что время ожидания истекло и к нему нельзя получить доступ, пока выполнение не будет возобновлено, и программа выдает необработанное исключение NullReferenceException.   -  person Will    schedule 30.01.2013


Ответы (3)


Почему бы вам просто не перейти по URL еще раз?

   webBrowser1.Navigate(webBrowser1.Url);

Это вызовет обработчики событий, которые вам нужны.

person John Koerner    schedule 29.01.2013
comment
Пробовал и это. Страница создается с помощью PHP и может изменяться в режиме реального времени, а не оставаться статической, что может быть причиной проблемы. Есть ли особый способ обработки веб-страниц, созданных PHP? - person Will; 30.01.2013
comment
Это работает до тех пор, пока URL-адрес не содержит хэш закладки, т. е. http://example.com/#hash. - person Fenton; 29.07.2015

У меня была похожая проблема при обновлении WebBrowser в нужное время. Как вы понимаете, безнадежно пытаться заставить его обновляться по требованию; ответ HTTP и рендеринг HTML являются недетерминированными.

Мой совет — прикрепить к DocumentCompleted события WebBrowser, вызовите нужную веб-страницу раньше в фоновом режиме и покажите пользователю что-нибудь, чтобы отвлечь его, а затем покажите завершенное WebBrowser после DocumentCompleted срабатывания.

person Dour High Arch    schedule 29.01.2013

Если вы хотите быть ленивым и не использовать фоновые потоки:

wb.Refresh();
while ((wb.ReadyState != WebBrowserReadyState.Complete)) {
    Application.DoEvents();
}
//Refresh is now complete

ReadyState должно быть WebBrowserReadyState.Complete только после завершения загрузки всего Ajax и контента.

person FlyingStreudel    schedule 30.01.2013