Колко време трябва да чакам, за да направя нещо, след като извикам 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