Я использую BrowserControl для навигации по диапазону веб-страниц на сайте, а затем парсинга HTML-кода и извлечения информации о книгах и т. Д.… У меня возникли проблемы, связанные (я думаю) с многопоточностью…вот так.
// MAIN LOOP
for (int i = 0; i < NumberOfPages; i++)
{
WebBrowser.Navigate("http://AWebSite/" + NumberOfPages.ToString());
}
// HANDLE ON_LOADED EVENT
void WebBrowser_LoadCompleted(object sender, NavigationEventArgs e)
{
// Retrieve HTMLDocument, Parse it etc
}
Теперь, когда событие срабатывает после перехода элемента управления на страницу, у меня есть несколько секунд:
OPTION1 Подождите несколько секундв моем основном цикле, например:
for (int i = 0; i < NumberOfPages; i++)
{
WebBrowser.Navigate("http://www.mysite.com");
// wait for 5 seconds
DateTime wait = new DateTime();
while (new DateTime().Ticks < wait.Ticks + 5000)
{
// not sure if I need do events here
}
}
OPTION2 Еще одна идея - использовать глобальную переменную как (булево) флаг для указания обработчику событий, что страница все еще загружается (флаг установлен как занятый)в основном виде, а затем сбросить, а затем сбросить после обработки HTML вернулся).
У меня такое чувство, что оба эти подхода неуклюжи, и действительно, есть лучший способ как-то справиться с этими двумя вещами (работать в разных потоках?)