Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Дождаться загрузки браузера


Автор: Алексеу 7.1.2009, 18:42
Хотел обратится с таким вопросом - использую webBrowser в программе, который работает в отдельном потоке. Браузер должен пройти по ряду сайтов, извлекая нужную информацию. Проблема в том, что если в цикле вызывать

Код

webBrowser1.Url = new Uri("Адрес_сайта");


то загрузка будет выполнена только последнего ресурса, а все остальные "проскочит". Как можно сделать так, чтобы браузер полностью загружал страницу, извлекал оттуда что-то, и лишь затем переходил на следующую итерацию в цикле?

заранее спасибо.

Автор: Partizan 7.1.2009, 18:46
Алексеу, конечно можно...

когда страница загружена webBrowser кидает событие Navigated

Автор: Алексеу 7.1.2009, 18:56
Partizan, вопрос не в этом. Там есть еще событие DocumentCompleted для этого, но они отработают хорошо только если загружать 1 страницу.

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

Например:

Код

for (int i = 0; i < mas.Length; i++)
               {
                   webBrowser1.Url = new Uri(mas[i]);
               }


События DocumentCompleted и Navigated если их вызывать то они отработают только для последнего элемента в массиве. Остальные урлы браузер не загрузит и "проглотит" по ходу выполнения цикла, остановившись на последнем элементе массива.

Вопрос в том как сделать так, чтобы браузер подождал пока по очереди полностью загрузятся все урлы в массиве и будет вытянута информация, а лишь после этого перейти к следующему витку цикла?

Автор: nagg 7.1.2009, 19:26
Получаете уведомление Navigated и лезете на следующий урл по очереди...

Автор: Алексеу 7.1.2009, 19:30
nagg, это уведомление получается только на последнем урле массива, все что до этого быстро "перелистывается" не доходя до загрузки, к сожалению.

Автор: nagg 7.1.2009, 20:13
Вы не совсем меня поняли, я говорил о чём-то таком:
(mas - ваш массив ссылок)

Код

        private void Start()
        {
            // загружаем первую страничку
            webBrowser1.Url = new Uri(mas[0]);
        }

        private int index = 0;
        private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            // тут работаете с вашей i-й загруженной страничкой

            // теперь загружаете следующию
            webBrowser1.Url = new Uri(mas[++index]);
        }

Автор: diadiavova 7.1.2009, 21:00
Вообще-то, если надо с сервера грузить много документов и тянуть и зних инфу, то лучше использовать WebClient, забивать данные в очередь и обрабатывать её в отдельном потоке. Быстрее будет.

Автор: Алексеу 7.1.2009, 21:14
Спасибо за советы!

Решил следующим образом:

Код

          private void load(int param)
           {
               webBrowser1.Navigate(mas[param]);
           }

           private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
           {
//Переменная ниже объявлена как глобальная в классе
               cur_iter++;
               load(cur_iter);
           }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)