我想知道如何在使用webbrowser时控制代码流?

时间:2011-07-03 13:47:21

标签: c# winforms visual-studio-2010 webbrowser-control

我有一个循环,并在循环中调用

   webbrowser.navigate("www.example.com");

在此之后你知道调用了documentcompleted函数并且我在这个函数中做了一些工作,但是在完成所有工作之后,没有任何事情发生代码不会像循环中那样回到循环和流程。我是做错了。

谢谢

2 个答案:

答案 0 :(得分:2)

此问题是由拥有循环引起的。 Web浏览器的导航只能完成,而DocumentCompleted事件只能在UI线程再次空闲时触发。这是多线程组件工作方式的核心,它们只能在UI线程空闲时触发UI线程上的“作业完成”事件并泵送消息循环。例如,BackgroundWorker类具有完全相同的要求。

解决问题的正确方法是创建状态机。通过告诉浏览器导航到第一个URL来启动它。您让DocumentCompleted事件处理程序处理响应,然后告诉浏览器导航到下一个URL。或者在没有更多网址处理时停止。

不正确的方法是在循环中调用Application.DoEvents()。泵送消息循环并允许事件触发。但这是一件非常危险的事情,DoEvents()并没有选择完全处理什么事件。如果您打算使用它,请务必阅读this answer

下一个方法是在下一版本的C#中即将支持async和await关键字。目前可用in CTP

答案 1 :(得分:0)

当您离开网页时,您的javascript通过导航离开,这类似于关闭您的应用程序并启动其他应用程序。

如果你有一个桌面应用程序,你写了:

Application.ExitAndStartOtherApplication("SomeOtherApplication.exe");

你不会期望在该行之后运行任何代码。

它是一回事。