none
ブラウザコントロールの読み込み完了待ちの方法(C#4.5) RRS feed

  • 質問

  • WebBrowserコントロールを使用しているのですが

    読み込み完了待ちを

    while (WebBrowser1.IsBusy == true || WebBrowser1.ReadyState != WebBrowserReadyState.Complete) {
                    Application.DoEvents();
                    if (m_FlgStop == true) { //m_FlgStopは普段はfalseだがキャンセルを押されたときなどはtrue
                        break;
                    }
                }

    というような関数を作って読み込み待ちをしていました

    ただ、C#で、こんなループを作ってあげくに、Application.DoEvents()というのもなぁ・・と
    こういうときは、どのような方法で、読み込み完了を検知するのが一般的なのでしょう

    2013年4月3日 15:11

回答

  • DoEvents をループに入れて回すというサンプルはよく目にしますが、止めたほうがよさそうです。

    代わりに WebBrowser の DocumentCompleted イベントのハンドラを用いるのが良いと思います。

    Web サイトや回線の状況によっては、いつまで待っても Navigate が完了しない or 時間がかかる場合があります。

    その場合、ReadyState がComplete にならず、while は無限ループになります。その無限ループの中で DoEvents が際限なく実行されるのは、どう考えても良い影響があるとは思えません。ここ MSDN フォーラムでも、スタックオーバーフローしたなどの問題が報告されています。

    WebBrowser Application.DoEvents をキーワードに検索してみてください。解決策も見つかると思います。

    • 回答としてマーク いちろう 2013年4月4日 8:52
    2013年4月3日 23:14

すべての返信

  • DoEvents をループに入れて回すというサンプルはよく目にしますが、止めたほうがよさそうです。

    代わりに WebBrowser の DocumentCompleted イベントのハンドラを用いるのが良いと思います。

    Web サイトや回線の状況によっては、いつまで待っても Navigate が完了しない or 時間がかかる場合があります。

    その場合、ReadyState がComplete にならず、while は無限ループになります。その無限ループの中で DoEvents が際限なく実行されるのは、どう考えても良い影響があるとは思えません。ここ MSDN フォーラムでも、スタックオーバーフローしたなどの問題が報告されています。

    WebBrowser Application.DoEvents をキーワードに検索してみてください。解決策も見つかると思います。

    • 回答としてマーク いちろう 2013年4月4日 8:52
    2013年4月3日 23:14
  • ありがとうございます
    DocumentCompleted を使うようにしてみます
    2013年4月4日 8:52