Я хочу знать, как контролировать поток кода при использовании веб-браузера? - PullRequest
0 голосов
/ 03 июля 2011

У меня есть цикл, и в цикле я вызываю

   webbrowser.navigate("www.example.com");

После этого вы знаете, что вызывается функция documentcompleted, и я выполняю некоторую работу в этой функции, но после того, как вся работа выполнена, ничего не происходит, код не возвращается в цикл и поток, как это происходит в циклах. делать что-то не так.

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 июля 2011

Эта проблема вызвана циклом .Навигация в веб-браузере может быть завершена только, а событие DocumentCompleted может сработать только тогда, когда ваш поток пользовательского интерфейса снова простаивает.Это является основой работы многопоточных компонентов, они могут запускать свое событие «работа выполнена» в потоке пользовательского интерфейса только тогда, когда поток пользовательского интерфейса простаивает и выполняет цикл обработки сообщений.Например, к классу BackgroundWorker предъявляются те же требования.

Чтобы решить эту проблему, нужно создать конечный автомат.Вы запускаете его, предлагая браузеру перейти к первому URL.Вы позволяете обработчику событий DocumentCompleted обрабатывать ответ, а затем сообщаете браузеру перейти к следующему URL-адресу.Или остановите, когда больше нет URL для обработки.

Неправильный способ - вызвать Application.DoEvents () в цикле.Это прокачивает цикл сообщений и позволяет событиям срабатывать.Но это очень опасная вещь, DoEvents () не избирательно определяет, что обрабатывается событий.Обязательно прочитайте этот ответ , если вы все равно планируете его использовать.

Следующий путь - это предстоящая поддержка асинхронных и ожидающих ключевых слов в следующей версии C #.В настоящее время доступны в ОСАГО .

0 голосов
/ 03 июля 2011

Когда вы покидаете веб-страницу, где включен ваш javascript, это аналогично закрытию вашего приложения и запуску другого приложения.

Если бы у вас было настольное приложение, в котором вы написали:

Application.ExitAndStartOtherApplication("SomeOtherApplication.exe");

Вы не ожидаете, что какой-нибудь код появится после этой строки для запуска.

Это то же самое.

...