WebBrowser.Navigate() в отдельном потоке
От: t0rch Россия  
Дата: 29.10.08 13:14
Оценка:
Здравствуйте, у в а ж а е м ы е!

Нужно WebBrowser-ом сходить по ссылке, выдрать из загруженной страницы ссылку, и сходить новым браузером по ней,
вот как я это делаю:



         public MainForm()
        {
            InitializeComponent();

            browser = new WebBrowser();

            // отключаю сообщения об ошибках
            this.browser.ScriptErrorsSuppressed = true;
            
            // подписываю Start на browser.DocumentCompleted
            this.browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(Start);
        }

        // счёлкую по кнопке
        private void ParseButton_Click(object sender, EventArgs e)
        {
            String link = "file://localhost/C:/test.htm";
            browser.Navigate(link);
        }
      
       // и по завершению загрузки страницы
      //  вызываю метод ParsePage класса PageParser
       private void Start(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (((WebBrowser)sender).ReadyState == WebBrowserReadyState.Complete)
            {
                PageParser parser = new PageParser();
                parser.ParsePage((WebBrowser)sender);                
            }
        }



далее, нужно выхватить определенную ссылку со страницы, и другим (новым) WebBrowser-ом
сходить на неё и забрать ещё какой-то текст.
Итак, мы вызвали parser.ParsePage((WebBrowser)sender);


// 

//class PageParser

        public void ParsePage(WebBrowser browser)
        {
            // получили коллекцию ссылок
            HtmlElementCollection references = browser.Document.Links;

            foreach (HtmlElement el in references)
            {
                String line;
                
                if (el.OuterHtml != null)
                {
                    // взяли html
                    line = el.OuterHtml.ToString();
                    
                    //и если в этом html есть нужный текст
                    if (line.Contains(_thatNeedToFind))
                    {
                        //выдрали оттедова ссылку
                        _newURL= GetURL(line);
                        
                        //и в отдельном потоке пытаемся сходить по ссылке
                        Thread thread = new Thread(GoThread);
                        thread.SetApartmentState(ApartmentState.STA);
                        thread.Start();
                        thread.Join();
                    }
                }
            }
        }


        private void GoThread()
        {
            var browser = new WebBrowser();
            browser.ScriptErrorsSuppressed = true;

            // подписываю Start на browser.DocumentCompleted
            browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(Start);

            browser.Navigate(_newURL);
           // после этой строчки отладчик сразу скачет на 4 строчки вверх, на начало метода,
           // один раз ещё проходит и выходит
        }

        // вот сюда отладчик не попадает, а надо бы!
        private void Start(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            var w = new WebBrowser();
            w = (WebBrowser)sender;

            if (w.ReadyState == WebBrowserReadyState.Complete)
            {

            }
        }


куда копать? Может что с областью видимости browser напортачил?
webbrowser
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.