4

我环顾四周很长时间,我注意到每个人都说 webbrowser 正在异步工作,我认为这是错误的,因为当我触发 Navigate 甚至实现 documentComplete 事件时,什么都没有发生。

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

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

例子:

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

但这里的诀窍是,当发生异常时,它会静默停止您的代码,而不会出现任何显式异常。所以我强烈建议在 try catch 块中使用 webbrowser 相关代码。

于 2012-10-13T17:48:58.370 回答