Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / WebBrowser + MultiThreading / 5 сообщений из 5, страница 1 из 1
30.11.2016, 21:34
    #39358073
Oblom811
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebBrowser + MultiThreading
Приветствую!
Есть задача в простой постановке: Грид, в котором каждая строчка содержит ссылку на веб-страницу. На веб-странице некие данные, которые надо обсчитать и вывести в этот же грид.
Чтобы скачивать страницы с данными используется компонент Web Browser, поскольку данные на страницу подкачиваются через JQuery и ResponseByRequest дает страницу без данных.
Чтобы грид был доступен в момент обсчета создается фоновый поток:
Код: c#
1.
2.
3.
                var th = new Thread(() => DoWork());
                th.SetApartmentState(ApartmentState.STA);
                th.Start();


Из потока данные пишутся в грид. Внутри потока строки грида обсчитываются последовательно.

Ещё важный момент, поскольку компонент WebBrowser работает асинхронно, то мне надо дождаться пока страница загрузится. В классическом понимании это делается через обработчик события DocumentCompleted. Однако событие наступает раньше, чем отрабатывают все JavaScript-ы, поэтому приходится делать кустарный метод:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
            WebBrowser wb = new WebBrowser();
            wb.ScriptErrorsSuppressed = true;
                    int i = 0;
string PageResult = String.Empty;

                    while (i < 60 && !IsDownloaded(PageResult))
                    {
                        Wait(0.5);
                        if (wb.Document != null)
                        {
                            try
                            {
                                PageResult = ((mshtml.HTMLDocument)(wb.Document.DomDocument)).documentElement.innerHTML;
                            }
                            catch { }
                        }
                        else
                        {
                            PageResult = String.Empty;
                        }
                        i++;
                    }


где IsDownloaded - кустарный метод проверки, что все данные уже есть на странице, а функция Wait - ожидание потока без его остановки:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
        private void Wait(double seconds)
        {
            int ticks = System.Environment.TickCount + (int)Math.Round(seconds * 1000.0);
            while (System.Environment.TickCount < ticks)
            {
                Application.DoEvents();
            }
        }



Обсчет занимает продолжительное время и мне в голову приходит замечательная идея! Обсчет каждой строчки выкинуть в отдельный поток, а потом дождаться самого медленного и закончить обработку.
Я делаю, всё работает, но проявляется проблема: на 4-5 потоке компонент WebBrowser перестает работать, причем в прямом смысле, сколько бы не прошло времени - страница даже не начинает качаться, wb.Document == null
Причем на моем компе всё работает корректно, а на трех других, до которых я смог дотянуться и проверить - нет.
Убираю многопоточность - опять всё в норме.
Почему WebBrowser может так себя вести в многопоточных приложениях?
...
Рейтинг: 0 / 0
30.11.2016, 22:06
    #39358081
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebBrowser + MultiThreading
Oblom811Почему WebBrowser может так себя вести в многопоточных приложениях?
WebBrouser - в лучших традициях майкрософт кривой ActiveX

я бы в отдельных процессах броузеры запускал (это нынче модно глядя на хром и эдж)
...
Рейтинг: 0 / 0
30.11.2016, 22:18
    #39358083
Oblom811
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebBrowser + MultiThreading
Изопропил,
Я новичок, только учусь, поэтому прошу сильно не пинать. А как сделать в отдельных процессах? в отдельных потоках я знаю, а вот с отдельными процессами не сталкивался. Можете кинуть ссылкой на описание с примерами?
...
Рейтинг: 0 / 0
01.12.2016, 11:20
    #39358304
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebBrowser + MultiThreading
Oblom811,
1. посмотри куда лезет JQuery, наверняка какой нибудь webapi, можно качать с помощью WebRequest
2. попробуй Awesomium
...
Рейтинг: 0 / 0
02.12.2016, 21:55
    #39359690
Oblom811
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WebBrowser + MultiThreading
ЕвгенийВOblom811,
1. посмотри куда лезет JQuery, наверняка какой нибудь webapi, можно качать с помощью WebRequest

Так в итоге и решил.

За ссылку спасибо, изучу.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / WebBrowser + MultiThreading / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]