2012-10-13 1 views
4

Я довольно долго смотрел вокруг, и я заметил, что все говорят, что webbrowser работает асинхронно, и я думаю, что это неправильно, потому что когда я запускаю Navigate и даже реализую событие documentComplete, ничего не происходит.Как я могу перемещаться по веб-браузеру синхронно?

Я заметил, что когда основной поток (поток, которому принадлежит веб-браузер), выполнил свою работу только тогда, когда веб-браузер начнет навигацию, возможно, потому что после этого браузер будет использовать основной поток для выполнения своих команд.

Теперь это не хорошо, потому что я хочу иметь возможность контролировать время, я хочу знать, когда веб-браузер загрузил страницу, а затем продолжить работу. Опрос не работает здесь из-за того, что я сказал ранее, веб-браузер даже не начинает навигацию.

пример:

WebBrowser browser = new WebBrowser(); 

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

// Then executing the next steps... 

Как я могу использовать WebBrowser синхронно, так что я могу быть в состоянии использовать свойства документа и другие вещи в WebBrowser, я хочу, чтобы создать какой-то метод блокировки Так что я могу иметь контроль и знать, когда WebBrowser выполнил загрузку.

+3

А, активный ожидания без сна. Не лучший способ пойти. – Vyktor

ответ

5

Когда вы перемещаете свой основной поток, вы не будете ждать завершения документа. Поэтому вам нужно заблокировать его с помощью глобальной varibale. Может быть грязное решение;

 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; 
    } 

Но трюк здесь, когда происходит исключение, он будет молча останавливать ваш код без какого-либо явного исключения. Поэтому я настоятельно рекомендую использовать код, связанный с webbrowser, внутри блока catch try.

+0

Человек, который вы первый человек, который дал правильное решение, благодарит много! Но я должен знать, почему он не обрабатывал событие document_Complete раньше? возможно, потому, что браузер в то время обрабатывал другие события и блокировал их? – Matan

+0

Если вы не вызываете ApplicationDoEvents() внутри цикла web-браузера do-while, он не может вызывать событие documentcompleted, поскольку оно однопоточное. – aliassce

+0

Итак, у веб-браузера есть основной поток? и поэтому он вообще не ориентировался? – Matan

Смежные вопросы