Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2015, 10:34   #1
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию Остановка работы webbrowser

Добрый день. Создал спайдер, собирающий информацию с сайта. Навигация происходит по форме с таблицей, в которой множество страниц. Использую компонент webbrowser. И такая беда, во время переходов webbrowser внезапно останавливается. Если вручную вернуться на страницу назад, например, то он продолжает работу как и должен. Но я хотел в будущем скрыть webbrowser с формы и оставлять его работать на пару часиков. В чем может быть причина остановки? Код перехода по страничкам
Код:
       private void ParseMarket()
        {
            bool isEnd = false;
            HtmlElementCollection AuctionsTable;
            try
            { 
                while(!isEnd)
                {
                    AuctionsTable = webBrowser1.Document.GetElementById("dnn_ctr691_View_procResultList").GetElementsByTagName("tr");
                    if (AuctionsTable.Count < 11)
                    {
                        isEnd = true;
                    }
                    for (var i = 1; i < AuctionsTable.Count; i++)
                    {
                        if (!ViewedNoticeNumbersArray.Contains(GetNoticeNumber(AuctionsTable[i])))
                        { 
                            AllNoticeNumbersArray.Add(GetNoticeNumber(AuctionsTable[i]));
                            ViewedNoticeNumbersArray.Add(GetNoticeNumber(AuctionsTable[i]));
                        }
                    }
                    if (isEnd) 
                    {
                        break;
                    } 
                    else 
                    {
                        webBrowser1.Navigate(webBrowser1.Document.GetElementById("dnn_ctr691_View_sAnext").GetAttribute("href"));
                        while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                        {
                            Application.DoEvents();
                        }
                    }
                }
                isProcessed = false;
                MessageBox.Show("ВСЁ");
            }
            catch
            {
                AllNoticeNumbersArray.Clear();
            }
        }
Еще такой момент, само приложение переносится на другой компьютер и запускается не из под VS, скомпиленая как релиз. Из под VS как в дебаге так и в релизе такой фишки не наблюдалось. На обоих компах win8 x64 хотя в любом случае ie7 должен запускаться...потихоньку начинаю плохо думать про сам сайт

Последний раз редактировалось Yoh; 15.01.2015 в 10:47. Причина: Дополнение важных деталей.
Yoh вне форума Ответить с цитированием
Старый 15.01.2015, 11:03   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Я б лучше Awesomium или Cef использовал вместо webbrowser.

Раз скрыть надо, то с Awesomium можно использовать windowless webview, в котором нет никакого отображения по умолчанию (можно делать скриншоты самому и т.п.). И заодно можно выделить ему отдельный поток, чтоб обойтись без DoEvents() в UI потоке.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.01.2015, 11:18   #3
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию

Спасибо, пороюсь в этом направлении. Хотел поглубже изучить webbrowser и ie, чтобы переходить на что то другое с полным пониманием, зачем перехожу. Но сейчас уже время поджимает( Про DoEvents позвольте уточнить, разве это критично? Я кнопки отключал, чтобы повторно задача не запускалась...неужели там есть еще камни? о_о
Yoh вне форума Ответить с цитированием
Старый 15.01.2015, 11:39   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну если все отключено, то наверно нету.
Но все равно как-то не очень выглядит, как goto, намекает на то, что скорее всего неправильный подход.

И еще
Код:
                        while (
                        {
                            Application.DoEvents();
                        }
тут же зря CPU грузиться будет.
http://en.wikipedia.org/wiki/Busy_waiting
Хотя бы какой-нибудь Thread.Sleep(1) добавить надо.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.01.2015, 12:47   #5
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию

Забыл про это напрочь( Недавно на c# пишу, книжки вроде читал, но более менее практика началась только сейчас( Спасибо большое =)
Yoh вне форума Ответить с цитированием
Старый 19.01.2015, 13:33   #6
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию

Решил таки написать, может кто то смотреть будет. Проблема была в цикле
Код:
                        while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                        {
                            Application.DoEvents();
                        }
Что в общем то, логично, вставать больше негде. Из разных тем (до конца не разобраных), предполагаю, что проблема в javascript'ах сайта, но виноваты возможно не они, сам webbrowser, у которого со скриптами туго. В итоге, webbrowser так и не переходит в состояние complete и висит в этом цикле вечно. Так как это не продукт на продажу, а приблуда для себя, решил обойти просто костылем, который выглядит вот так:
Код:
                        webBrowser1.Navigate(webBrowser1.Document.GetElementById("dnn_ctr691_View_sAnext").GetAttribute("href"));
                        DateTime StartNavigating = DateTime.Now;
                        while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                        {
                            Thread.Sleep(1);
                            if(DateTime.Now.Subtract((StartNavigating)).Minutes >= 1)
                            {
                                break;
                            }
                            Application.DoEvents();
                        }
Грубо, некрасиво, но работает и решается в пару строк. А Awesomium поставлен на изучение, посмотрим, всплывет ли проблема

Последний раз редактировалось Yoh; 19.01.2015 в 13:38.
Yoh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Остановка работы компьютера, полное зависание Richard3214 Windows 4 13.01.2015 01:14
WPF-WebBrowser Awesomium - Прекращение работы приложения valkiriy C# (си шарп) 5 09.04.2013 13:47
Остановка работы мыши. Dezmont_ Общие вопросы .NET 3 16.06.2011 11:55
Остановка работы функции Alexcomeback Общие вопросы по Java, Java SE, Kotlin 3 12.01.2011 09:45
Остановка работы формы Darw1n Помощь студентам 4 15.03.2010 13:54