Альтернатива Application.DoEvents()

Я разрабатываю систему обмена сообщениями на основе элементов управления webBrowser, чтобы я мог форматировать текст, как мне заблагорассудится. Когда пользователь находится в автономном режиме и ему отправляются сообщения, сообщения сохраняются, и событие отправляется для каждого сообщения, когда они снова входят в систему. Когда я устанавливаю html по умолчанию и тому подобное для веб-сайта, я обычно использую:

while (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();

Это работает, когда программа работает нормально. Когда пользователь получает сообщение, отправленное в автономном режиме, это запускает событие следующего сообщения и так далее, с каждым сообщением до последнего. Это означает, что отображается только последнее сообщение, отправленное в автономном режиме. Я хотел бы что-то вроде Application.DoEvents(), которое позволяет элементу управления обновлять и загружать, но не запускает другие события.

Спасибо

РЕДАКТИРОВАТЬ:

Я исправил проблему, полностью удалив DoEvents(). Вместо того, чтобы менять DocumentText во время работы, я настроил построитель строк, а затем в конце сразу задал весь html.


person Nathan Tornquist    schedule 19.07.2011    source источник
comment
Если вы звоните Application.DoEvents(), обычно это указывает на ошибку в вашем проекте. Есть ли причина, по которой вы не можете использовать событие «завершено»?   -  person leppie    schedule 19.07.2011
comment
По сути, мне нужно, чтобы веб-браузер завершил загрузку, но текущий поток продолжал работать. Я форматирую сообщение, а затем проверяю резервный html. Если html неверен, я обновляю его, а затем добавляю сообщение. Прежде чем изменить текст документа, я удостоверяюсь, что веб-браузер загружен и находится в состоянии полной готовности.   -  person Nathan Tornquist    schedule 19.07.2011


Ответы (2)


Я рекомендую вам прекратить использовать Application.DoEvents(), он создает больше проблем, чем решает. проверьте это.

Лучшим способом является либо использование AutoResetEvent для уведомления о завершении загрузки, либо создание события всякий раз, когда загрузка выполняется. также вы можете запустить ожидание в другом потоке, поэтому вам не нужно использовать Application.DoEvents()...

person Jalal Said    schedule 19.07.2011
comment
Это была отличная статья. На самом деле, я просто хотел бы, чтобы элемент управления webBrowser завершил загрузку, а затем продолжил. Меня не волнует, затронут ли пользовательский интерфейс, потому что код должен работать достаточно быстро, чтобы избежать ошибок. Однако то, как работает DoEvents(), я знаю, что это даже не близко к решению. Однако я бы хотел избежать участия в других мероприятиях. Я хочу оставаться в рамках метода бега, если смогу. - person Nathan Tornquist; 19.07.2011
comment
Это не решило мою проблему, но я принимаю ответ из-за ссылки на DoEvents(). Предоставленной информации мне хватило, чтобы переписать программу. - person Nathan Tornquist; 20.07.2011

Вы можете использовать System.Threading.Thread.Join() в качестве альтернативы DoEvents(), поскольку этот метод останавливает выполнение вашего текущего потока до тех пор, пока предыдущий поток вызова не завершит выполнение.

person Prahlad Yeri    schedule 19.07.2011
comment
Это не позволит загрузить WebBrowser. Кроме того, нет второго потока. - person SLaks; 19.07.2011