Запуск события WebBrowser.DocumentCompleted в цикле

У меня есть простое приложение, которое я разрабатываю, которое должно перебирать список URL-адресов, которые передаются функции навигации веб-браузеров в цикле for each. Я надеялся увидеть, что событие DocumentCompleted срабатывает после каждого вызова функции Navigate, но, похоже, оно срабатывает только после завершения загрузки всей формы - и этот цикл завершился.

Я предполагаю, что мне не хватает чего-то фундаментального здесь, но некоторая помощь и совет были бы замечательными!

Спасибо!

Вот пример кода, который я пытаюсь...

Этот цикл foreach запускается в событии загрузки формы страницы WinForms, которую я использую...

            int id = 0;
        foreach (DataRow row in quals.Rows)
        {
            URN = row["LAIM_REF"].ToString();

            string URN_formated = URN.Replace("/", "_");
            string URL = "http://URL_I_AM_GOING_TOO/";
            string FullURL = URL + URN_formated;

            wbrBrowser.ScriptErrorsSuppressed = true;
            wbrBrowser.Refresh();
            wbrBrowser.Navigate(FullURL);

            id += 1;

            label1.Text = id.ToString();

        }

В точке цикл доходит до строки:

wbrBrowser.Navigate(FullURL);

Я надеялся, что событие:

        private void wbrBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
...
}

будет срабатывать, поэтому он сможет запускать процессы для каждого из URL-адресов, возвращаемых в цикле.

Спасибо!


person CJH    schedule 14.07.2015    source источник
comment
Не могли бы вы предоставить код, чтобы показать, что вы пробовали до сих пор? Это приложение WPF или WinForm? Также были бы полезны некоторые диагностические трассировки, если таковые имеются.   -  person Evil Toad    schedule 14.07.2015
comment
Я только что добавил несколько фрагментов кода к исходному вопросу в надежде, что это поможет найти решение моей проблемы.   -  person CJH    schedule 14.07.2015


Ответы (1)


Я использовал:

while (wbrBackground.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }

после функции навигации, и теперь она работает должным образом.

person CJH    schedule 14.07.2015
comment
Это плохо: 1) он использует цикл ожидания занятости, который напрасно сжигает ядра вашего процессора; 2) Он использует DoEvents, который почти всегда является злом< /а>. - person noseratio; 15.07.2015
comment
Спасибо, Noseratio. Есть ли у вас какие-либо предложения о том, как этого можно добиться другим способом? - person CJH; 15.07.2015
comment
Я делаю, например. это, кажется, я публиковал его раньше; или это. - person noseratio; 15.07.2015
comment
Оба отлично выглядят! Я смотрю, в частности, на тот, который использует тестовый сайт example.com, но не могу заставить его работать в winform...?? Это специально написано для работы в качестве консольного приложения? - person CJH; 15.07.2015
comment
Этот делает это как приложение WinForms. - person noseratio; 15.07.2015
comment
Бинго!! Именно то, что я был после! Большое спасибо за это! Именно то, что я искал, и смог использовать эту структуру для достижения того, к чему стремился! - person CJH; 16.07.2015