Хорошо, вот в чем дело - я запускаю элемент управления Windows Forms WebBrowser
из службы. Я знаю, что нет-нет, но, похоже, все в порядке.
Единственная проблема, с которой я сталкиваюсь, - это попытка дождаться загрузки страниц браузера. В обычном приложении я бы просто сделал что-то вроде
while (browser.readystate != complete)
Application.DoEvents()
Очевидно, что это не будет работать от службы.
Я пробовал это как альтернативу:
public class WebCrawler
{
private class ExposedActiveXWebBrowser : System.Windows.Forms.WebBrowser
{
public SHDocVw.WebBrowser UnderlyingWebBrowser
{
get
{
return ActiveXInstance as SHDocVw.WebBrowser;
}
}
}
ExposedActiveXWebBrowser worker;
public WebBrowserReadyState ReadyState
{
get
{
return worker.ReadyState;
}
}
public HtmlDocument Document
{
get
{
return worker.Document;
}
}
public WebCrawler()
{
worker = new ExposedActiveXWebBrowser();
}
public void Navigate(string urlString)
{
worker.Navigate(urlString);
while (worker.UnderlyingWebBrowser.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE)
Thread.Sleep(0);
}
}
Этот метод Navigate, однако, не работает. ReadyState никогда не меняется от LOADING.
Что мне интересно, так это то, что веб-браузеры форм Windows кажутся по своей сути асинхронными, значит ли это, что элемент ActiveX уже выполняется в своем собственном потоке?
Могу ли я, получив доступ к базовому элементу управления activex через соответствующий интерфейс, просто подождать его завершения?