Как я могу синхронно перемещаться по веб-браузеру?

Я довольно долго оглядывался и заметил, что все говорят, что веб-браузер работает асинхронно, и я думаю, что это неправильно, потому что, когда я запускаю 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, веб-браузер не может вызывать событие documentcompleted, поскольку оно является однопоточным. - 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 (какое-то время), веб-браузер не будет перемещаться в это время, это означает, что веб-браузер не асинхронный, я прав? ? Большое спасибо за помощь, вы молодцы =] - person Matan Givoni; 14.10.2012