わかりました、これが取り引きです - 私はWebBrowser
サービスから Windows フォーム コントロールを実行しています。私はそれがノーノーであることを知っていますが、うまくいくようです.
私が問題に直面しているのは、ブラウザのページが読み込まれるのを待つことだけです。通常のアプリケーションでは、次のようなことをするだけです
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 フォームの WebBrowsers は本質的に非同期のように見えるということです。これは、ActiveX コントロールが独自のスレッドで既に実行されているということですか?
適切なインターフェイスを介して基になる ActiveX コントロールにアクセスして、完了するまで待つことはできますか?