4

私はかなりの時間を調べましたが、誰もが Web ブラウザーが非同期で動作していると言っていることに気付きました。Navigate をトリガーし、documentComplete イベントを実装しても何も起こらないため、それは間違っていると思います。

メイン スレッド (Web ブラウザーを所有するスレッド) がジョブを実行したときにのみ、Web ブラウザーがナビゲートを開始することに気付きました。おそらく、その後、ブラウザーはメイン スレッドを使用してコマンドを実行するためです。

タイミングを制御できるようにしたいので、これは良くありません。Webブラウザーがページの読み込みをいつ完了したかを知り、作業を続行できるようにしたいと考えています。先に言ったように、ここではポーリングが機能しません。Web ブラウザーはナビゲートを開始しません。

例:

WebBrowser browser = new WebBrowser();

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

// Then executing the next steps...

WebBrowser を同期的に使用して、WebBrowser のドキュメント プロパティやその他のものを使用できるようにするにはどうすればよいですか。ある種のブロッキング メソッドを作成したいので、WebBrowser がいつロードを完了したかを制御して知ることができます。

4

1 に答える 1

6

メインスレッドをナビゲートするとき、ドキュメントが完了するのを待ちません。したがって、グローバル変数を介してブロックする必要があります。汚れた解決策は次のようになります。

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

ただし、ここでの秘訣は、例外が発生すると、明示的な例外なしにコードをサイレントに停止することです。したがって、trycatchブロック内でwebbrowser関連のコードを使用することを強くお勧めします。

于 2012-10-13T17:48:58.370 に答える