Я знаю, что об этом спрашивали раньше , но я не думаю, эти решения являются гибкими.Событие DocumentCompleted
должно использоваться для определения времени завершения загрузки, а не как метод выполнения работы.Если вам нужно выполнить несколько различных задач, по которым приходится выполнять навигацию по нескольку раз, размещение логики в событии DocumentCompleted
превращает ее в грязный коммутатор / маршрутизатор, который трудно читать и обслуживать.
Вам нужночто-то, что может действительно ждать во время выполнения вашего метода, выполняя навигацию, чтобы вы могли продолжить свою задачу в методе, в котором вы уже находитесь. Мой первый метод - это фактический метод Wait ().
Я думаю, что-то вроде этого близко:
void WaitForLoad()
{
isLoading = true;
while (isLoading)
{
if (Application.Current == null) break;
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, (DispatcherOperationCallback)delegate(object unused) { return null; }, null);
}
}
И установить Isloading в false в событии DocumentCompleted
.
Вы сможете просто вызывать этот метод после любого действия, которое вызовет загрузку страницы.Это работает, у него есть некоторые проблемы.
1) отправляет загрузку ЦП для приложения до 35% до загрузки страницы, даже если ничего не происходит.
2) если приложение пытается закрыться во время работы, цикл продолжит работу и оставит приложение открытым без окон, следовательно, потребуется перерыв, когда приложение будет нулевым.
Можно ли это исправить, или я ошибаюсь?
Редактировать : Я попытался реализовать решение ManualResetEvent ниже, но это привело к ряду других проблем, в которых я не уверенможет быть решена без создания более сложной ситуации, чем описанная выше.Поскольку WebBrowser находится на пользовательском интерфейсе, блокировка потока останавливает все приложение.Если работа выполняется в фоновом потоке, ее можно заблокировать, но доступ к веб-браузеру становится очень трудным.