如何同步导航webbrowser?

giv*_*ivo 4 c# asynchronous synchronous webbrowser-control

我已经看了很长时间,我注意到每个人都说webbrowser异步工作,我认为它是错误的,因为当我触发Navigate甚至实现documentComplete事件时,没有任何反应.

我注意到当主线程(拥有webbrowser的线程)完成了他的工作时,webbrowser开始导航,可能是因为之后浏览器将使用主线程来执行他的命令.

既然这不好,因为我希望能够控制时间,我希望能够知道webbrowser何时完成加载页面然后继续我的工作.轮询在这里不起作用,因为我之前说过,webbrowser甚至没有开始导航.

例:

WebBrowser browser = new WebBrowser();

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

// Then executing the next steps...
Run Code Online (Sandbox Code Playgroud)

我如何同步使用WebBrowser,以便能够使用文档属性和WebBrowser的其他东西,我想创建某种阻塞方法所以我可以控制并知道WebBrowser何时完成加载.

ali*_*sce 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;
    }
Run Code Online (Sandbox Code Playgroud)

但是这里的诀窍是当异常发生时它会默默地停止你的代码而没有任何明显的异常.所以我强烈建议在try catch块中使用与webbrowser相关的代码.