Как мога да навигирам в уеб браузъра синхронно?

Оглеждах се доста време и забелязах, че всички казват, че уеббраузърът работи асинхронно и мисля, че е грешно, защото когато задействам Navigate и дори внедря събитието documentComplete, нищо не се случва.

Забелязах, че когато главната нишка (нишката, която притежава уеб браузъра) свърши работата си, едва тогава уеб браузърът започва да навигира, вероятно защото след това браузърът ще използва главната нишка, за да изпълнява своите команди.

сега това не е добре, защото искам да мога да контролирам времето, искам да мога да знам кога уеб браузърът е приключил със зареждането на страницата и след това да продължа с работата си. Анкетирането не работи тук поради това, което казах по-рано, уеббраузърът дори не започва да навигира.

пример:

WebBrowser browser = new WebBrowser();

browser.Navigate(url);
while(browser.ReadyState != WebBrowserReadyState.Complete)
{
}

// Then executing the next steps...

Как мога да използвам уеббраузъра синхронно, за да мога да използвам свойството на документа и други неща на уеббраузъра, искам да създам някакъв метод за блокиране, за да мога да контролирам и да знам кога уеббраузърът е приключил със зареждането.


person Matan Givoni    schedule 13.10.2012    source източник
comment
Ах, активно чакане без сън. Не е най-добрият начин.   -  person Vyktor    schedule 13.10.2012


Отговори (1)


Когато навигирате, основната ни нишка няма да изчака завършването на документа. Така че трябва да го блокирате чрез глобална променлива. Мръсно решение може да бъде;

        bool IsReady;
    void Go()
    {
        IsReady = false;
        brw.Navigate("url");
        do
        {
            Thread.Sleep(10);
            Application.DoEvents();
        } while (!IsReady);
    }

   void brw_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        IsReady = true;
    }

Но трикът тук е, че когато се случи изключение, той тихо ще спре вашия код без изрично изключение. Така че горещо препоръчвам използването на код, свързан с уеб браузър, в блока try catch.

person aliassce    schedule 13.10.2012
comment
Човече, ти си първият човек, който даде правилното решение, благодаря много! Но трябва да знам защо не се справи със събитието document_Complete преди? може би защото браузърът обработва други събития по това време и причинява блокиране? - person Matan Givoni; 13.10.2012
comment
Ако не извикате ApplicationDoEvents() вътре в do-while цикъла, уеббраузърът не може да извика събитие за завършен документ, тъй като е еднопоточно. - person aliassce; 13.10.2012
comment
Така че уеб браузърът използва главната нишка? и затова изобщо не навигираше? - person Matan Givoni; 13.10.2012
comment
Вашият цикъл while може да не попречи на навигацията. (Мисля, че уеб браузърът навигира acync) Но този цикъл ще предотврати анулирането на формуляра и други актуализации. Така че може да не видите новата страница като нищо нарисувано. Отново Application.DoEvents() ни позволява да видим какво се е случило. - person aliassce; 14.10.2012
comment
Едно последно нещо, мисля, че цикълът не е свързан с това, което казахте, защото ако направя Thread.Sleep (известно време), уеб браузърът няма да не навигира в този момент означава, че уеб браузърът не е asnyc, прав ли съм ? Благодаря много за цялата помощ, страхотни сте =] - person Matan Givoni; 14.10.2012