WebBrowser.
От: Ocenochka  
Дата: 26.10.06 11:01
Оценка:
Делаю так:
        public bool Download(Uri uri, out HtmlDocument htmlDocument)
        {
            bool result = true;

            WebBrowser webBrowser = new WebBrowser();
            webBrowser.Navigate(uri);

            DateTime timeStart = DateTime.Now;
            TimeSpan ts = new TimeSpan(0, 0, 30);
            while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
            {
                if (DateTime.Now - timeStart > ts)
                {
                    webBrowser.Navigate(uri);
                    timeStart = DateTime.Now;
                }
/*1*/           Application.DoEvents();
            }

            htmlDocument = webBrowser.Document;

            return result;
        }

Этот метод запускается в отдельном потоке, который создаю так:
            _OneThread = new Thread(new System.Threading.ThreadStart(this.Process));
            _OneThread.ApartmentState = ApartmentState.STA;
            _OneThread.Start();

this.Process — это метод, в котором вызывается Download().


Вопрос: Как сделать, чтобы процессор не загружался на 100% в /*1*/?
Менять эту строку на Thread.Sleep(N); нельзя, как мне кажеться, потому что, приостановка потока, в котором выполняется WebBrowser приведет к тому, что во время Sleep() WebBrowser работать не будет.
Люблю ставить оценки.
Re: WebBrowser.
От: Константин Л. Франция  
Дата: 26.10.06 11:20
Оценка:
Здравствуйте, Ocenochka, Вы писали:

убрать "while (webBrowser.ReadyState" ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: WebBrowser.
От: Ocenochka  
Дата: 26.10.06 11:38
Оценка:
КЛ>убрать "while (webBrowser.ReadyState" ?

А как дождаться конца загрузки страницы? События не предлагать!
Люблю ставить оценки.
Re[3]: WebBrowser.
От: Yozik Россия  
Дата: 26.10.06 11:40
Оценка:
Здравствуйте, Ocenochka, Вы писали:

КЛ>>убрать "while (webBrowser.ReadyState" ?


O> А как дождаться конца загрузки страницы? События не предлагать!


А чем событие не устраивает?
Re[4]: WebBrowser.
От: Ocenochka  
Дата: 26.10.06 12:02
Оценка:
КЛ>>>убрать "while (webBrowser.ReadyState" ?
O>> А как дождаться конца загрузки страницы? События не предлагать!
Y>А чем событие не устраивает?

Ну если в итоге вызывать нужно будет только один метод Download(), то с удовольствием выслушаю ваш вариант.
Пока придумал только обернуть WebBrowser в класс SinWebBrowser, который будет работать в отдельном потоке, ждать события от WebBrowser'а и по приходу события, генерить другое событие, которого ждать (например, через bool flag) в методе Download(). Тогда в потоке Download()'а можно будет делать Sleep(). Но это похоже на гон.
Люблю ставить оценки.
Re: WebBrowser.
От: kig Россия  
Дата: 26.10.06 12:38
Оценка: 3 (1)
Здравствуйте, Ocenochka, Вы писали:

[]

O>Вопрос: Как сделать, чтобы процессор не загружался на 100% в /*1*/?

O>Менять эту строку на Thread.Sleep(N); нельзя, как мне кажеться, потому что, приостановка потока, в котором выполняется WebBrowser приведет к тому, что во время Sleep() WebBrowser работать не будет.

Менять строку /*1*/ на Thread.Sleep(N) не надо. Надо Thread.Sleep(N) вставить до (или после) строки /*1*/. WebBrowser во время Sleep работать не будет, но загрузка будет идти, т.к. загрузка в инфраструктуре IE асинхронна (не задавался вопросом, почему код проваливается сразу после webBrowser.Navigate(uri)?) и временная разница в обработке загруженного (парсинг в DOM, отрисовка) по сравнению с самой загрузкой (из файлов, по http) состовляет порядки. (Исключением может быть только загрузка из памяти). Соответственно, без некоторого разумного ожидания (обычно порядка сотен миллисекунд), Application.DoEvents() крутиться на обработке пустой очереди сообщений.
Re[2]: WebBrowser.
От: Ocenochka  
Дата: 26.10.06 12:43
Оценка:
kig>Менять строку /*1*/ на Thread.Sleep(N) не надо. Надо Thread.Sleep(N) вставить до (или после) строки /*1*/. WebBrowser во время Sleep работать не будет, но загрузка будет идти, т.к. загрузка в инфраструктуре IE асинхронна (не задавался вопросом, почему код проваливается сразу после webBrowser.Navigate(uri)?) и временная разница в обработке загруженного (парсинг в DOM, отрисовка) по сравнению с самой загрузкой (из файлов, по http) состовляет порядки. (Исключением может быть только загрузка из памяти). Соответственно, без некоторого разумного ожидания (обычно порядка сотен миллисекунд), Application.DoEvents() крутиться на обработке пустой очереди сообщений.

Что значит, "загрузка в инфраструктуре IE асинхронна"? Не понял. WebBrowser работает в своем потоке?

зы Сейчас буду пробовать ставить Sleep(N) после DoEvent(). Спасибо!
Люблю ставить оценки.
Re[3]: WebBrowser.
От: Константин Л. Франция  
Дата: 26.10.06 12:51
Оценка: 1 (1)
Здравствуйте, Ocenochka, Вы писали:

kig>>Менять строку /*1*/ на Thread.Sleep(N) не надо. Надо Thread.Sleep(N) вставить до (или после) строки /*1*/. WebBrowser во время Sleep работать не будет, но загрузка будет идти, т.к. загрузка в инфраструктуре IE асинхронна (не задавался вопросом, почему код проваливается сразу после webBrowser.Navigate(uri)?) и временная разница в обработке загруженного (парсинг в DOM, отрисовка) по сравнению с самой загрузкой (из файлов, по http) состовляет порядки. (Исключением может быть только загрузка из памяти). Соответственно, без некоторого разумного ожидания (обычно порядка сотен миллисекунд), Application.DoEvents() крутиться на обработке пустой очереди сообщений.


O> Что значит, "загрузка в инфраструктуре IE асинхронна"? Не понял. WebBrowser работает в своем потоке?


Внутри его методов (Navigate/Navigate2 etc.) создается поток/потоки, которые и выполняют всю работу

O>зы Сейчас буду пробовать ставить Sleep(N) после DoEvent(). Спасибо!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: WebBrowser.
От: Yozik Россия  
Дата: 26.10.06 13:06
Оценка: 2 (1)
Здравствуйте, Ocenochka, Вы писали:

КЛ>>>>убрать "while (webBrowser.ReadyState" ?

O>>> А как дождаться конца загрузки страницы? События не предлагать!
Y>>А чем событие не устраивает?

O> Ну если в итоге вызывать нужно будет только один метод Download(), то с удовольствием выслушаю ваш вариант.

O> Пока придумал только обернуть WebBrowser в класс SinWebBrowser, который будет работать в отдельном потоке, ждать события от WebBrowser'а и по приходу события, генерить другое событие, которого ждать (например, через bool flag) в методе Download(). Тогда в потоке Download()'а можно будет делать Sleep(). Но это похоже на гон.
O>

Может так?


AutoResetEvent documentLoaded;

public bool Download(Uri uri, out HtmlDocument htmlDocument)
        {
            bool result = true;

            WebBrowser webBrowser = new WebBrowser();
            webBrowser .DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentLoaded);
            webBrowser.Navigate(uri);

            documentLoaded.WaitOne();

            htmlDocument = webBrowser.Document;

            return result;
        }

private void DocumentLoaded(object sender,
    WebBrowserDocumentCompletedEventArgs e)
{
     documentLoaded.Set();
}
Re[6]: !WebBrowser + Proxy + UserAgent!
От: Ocenochka  
Дата: 27.10.06 08:37
Оценка:
Не могу найти как установить Proxy для WebBrowser'а и как поменять его свойство UserAgent? Нашел варианты только для неуправляемого кода. Еще есть вариант менять ключи в реестре, но это не пойдет, т.к. изменения касаются и пользовательских процессов IE, к тому же, говорят, действия вступают в силу только после закрытия всех окон IE, в том числе пользовательских.
Как же заставить WebBrwoser менять внутри одного экземпляра прокси и userAgent'a, ну, или хотя бы, в пределах процесса.
Люблю ставить оценки.
Re[7]: !WebBrowser + Proxy + UserAgent!
От: Константин Л. Франция  
Дата: 27.10.06 08:44
Оценка: 2 (1)
Здравствуйте, Ocenochka, Вы писали:

O> Не могу найти как установить Proxy для WebBrowser'а и как поменять его свойство UserAgent? Нашел варианты только для неуправляемого кода. Еще есть вариант менять ключи в реестре, но это не пойдет, т.к. изменения касаются и пользовательских процессов IE, к тому же, говорят, действия вступают в силу только после закрытия всех окон IE, в том числе пользовательских.

O> Как же заставить WebBrwoser менять внутри одного экземпляра прокси и userAgent'a, ну, или хотя бы, в пределах процесса.

это жо..а. смотри в сторону IDocHostUIHandler2::GetOverrideKeyPath
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.