我已经看了很长时间,我注意到每个人都说webbrowser是异步工作的,我认为这是错误的,因为当我触发Navigate甚至实现documentComplete事件时,没有任何反应。
我注意到当主线程(拥有webbrowser的线程)完成了他的工作时,webbrowser开始导航,可能是因为之后浏览器将使用主线程来执行他的命令。
现在不好,因为我希望能够控制时间,我希望能够知道webbrowser何时完成加载页面然后继续我的工作。由于我之前所说的,网页浏览器甚至没有开始导航,因此轮询在这里不起作用。
示例:
WebBrowser browser = new WebBrowser();
browser.Navigate(url);
while(browser.ReadyState != WebBrowserReadyState.Complete)
{
}
// Then executing the next steps...
如何同步使用WebBrowser,以便能够使用文档属性和WebBrowser的其他东西,我想创建某种阻塞方法所以我可以控制并知道WebBrowser何时完成加载。
答案 0 :(得分: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相关的代码。