Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
30.11.2016, 21:34
|
|||
---|---|---|---|
|
|||
WebBrowser + MultiThreading |
|||
#18+
Приветствую! Есть задача в простой постановке: Грид, в котором каждая строчка содержит ссылку на веб-страницу. На веб-странице некие данные, которые надо обсчитать и вывести в этот же грид. Чтобы скачивать страницы с данными используется компонент Web Browser, поскольку данные на страницу подкачиваются через JQuery и ResponseByRequest дает страницу без данных. Чтобы грид был доступен в момент обсчета создается фоновый поток: Код: c# 1. 2. 3.
Из потока данные пишутся в грид. Внутри потока строки грида обсчитываются последовательно. Ещё важный момент, поскольку компонент 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.
где IsDownloaded - кустарный метод проверки, что все данные уже есть на странице, а функция Wait - ожидание потока без его остановки: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Обсчет занимает продолжительное время и мне в голову приходит замечательная идея! Обсчет каждой строчки выкинуть в отдельный поток, а потом дождаться самого медленного и закончить обработку. Я делаю, всё работает, но проявляется проблема: на 4-5 потоке компонент WebBrowser перестает работать, причем в прямом смысле, сколько бы не прошло времени - страница даже не начинает качаться, wb.Document == null Причем на моем компе всё работает корректно, а на трех других, до которых я смог дотянуться и проверить - нет. Убираю многопоточность - опять всё в норме. Почему WebBrowser может так себя вести в многопоточных приложениях? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.11.2016, 22:06
|
|||
---|---|---|---|
WebBrowser + MultiThreading |
|||
#18+
Oblom811Почему WebBrowser может так себя вести в многопоточных приложениях? WebBrouser - в лучших традициях майкрософт кривой ActiveX я бы в отдельных процессах броузеры запускал (это нынче модно глядя на хром и эдж) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
30.11.2016, 22:18
|
|||
---|---|---|---|
|
|||
WebBrowser + MultiThreading |
|||
#18+
Изопропил, Я новичок, только учусь, поэтому прошу сильно не пинать. А как сделать в отдельных процессах? в отдельных потоках я знаю, а вот с отдельными процессами не сталкивался. Можете кинуть ссылкой на описание с примерами? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
01.12.2016, 11:20
|
|||
---|---|---|---|
WebBrowser + MultiThreading |
|||
#18+
Oblom811, 1. посмотри куда лезет JQuery, наверняка какой нибудь webapi, можно качать с помощью WebRequest 2. попробуй Awesomium ... |
|||
:
Нравится:
Не нравится:
|
|||
|
02.12.2016, 21:55
|
|||
---|---|---|---|
|
|||
WebBrowser + MultiThreading |
|||
#18+
ЕвгенийВOblom811, 1. посмотри куда лезет JQuery, наверняка какой нибудь webapi, можно качать с помощью WebRequest Так в итоге и решил. За ссылку спасибо, изучу. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&mobile=1&tid=1400174]: |
0ms |
get settings: |
10ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
78ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 186ms |
0 / 0 |