注册 登录
编程论坛 VB.NET论坛

为什么使用vb.net的过程让webbrowser控件加载网页时,必须运行到end sub后,才刷新网页?

yangmz 发布于 2023-04-26 12:08, 76 次点击
本人正在学习使用webbrowser控件制作一个网页自动浏览器,自己玩网页游戏。但遇到如下问题不能解决。
思路:当在load事件中用Navigate方法载入网页,加载网页结束后,在DocumentCompleted事件中用代码获取到所有标签和相应的链接地址。
的某一个过程中(举例过程名为aaa),用代码通过在DocumentCompleted事件中得到所有的标签和地址查找相应的标签访问指定的网页。
但在该过程连续通过多个标签来访问不同的网页,不成功,网页没有刷新。
过程如下:
sub aaa
查找到标签"副本"相应地地址bb
Navigate(bb)     ‘进入到地址bb的网页

在打开的"副本"连接网页中再查找标签为"副本1"相应地地址cc
Navigate(cc)     ‘进入到地址cc的网页

end sub

通过调试运行发现,运行完Navigate(bb)后,webbrowser没有更新,一直是进入到标签"副本"之前的网页,所以Navigate(cc)也就达不到运行的目的了。

如果是下面这样就可以
ub aaa
查找到标签"副本"相应地地址bb
Navigate(bb)     ‘进入到地址bb的网页
end sub
运行完后,就马上显示地址bb的网页。
这是怎么回事呢?
2 回复
#2
东海ECS2023-04-26 19:13
这是因为Navigate方法是异步的。这意味着它会在后台开始导航并立即返回控件以使主线程不会停止响应。因此,在调用Navigate方法后,如果立即采取其他操作,那么主线程会立即执行它们,而Navigate方法将在后台完成。

在第一个示例中,当你调用Navigate(bb)时,webbrowser开始导航到地址bb,但是你没有给它足够的时间来加载和渲染网页。因此,当你调用Navigate(cc)时,它将链接到未加载完全的网页上,而不是你想要的地址cc。

而在第二个示例中,你只调用了一次Navigate方法,因此它有足够的时间加载和渲染文档。因此,当Navigate方法完成后,你可以立即执行其他操作。

如果你想在Navigate方法完成后再执行其他操作,你可以在DocumentCompleted事件中加入所需的操作。例如,你可以为每次导航设置一个全局变量usedByNavigate,然后在DocumentCompleted事件中检查该变量,如果usedByNavigate为True,则执行你的其他操作。这样就可以确保Navigate方法完成后再执行其他操作。
#3
yangmz2023-04-27 11:46
我想在加载一个网页时,等它加载完全再向后加载下一个网页地址
sub aaa()
            Web1.Navigate(aa)
            While (Web1.IsBusy)
                Application.DoEvents()
            End While

            Web1.Navigate(bb)
            While (Web1.IsBusy)
                Application.DoEvents()
            End While
   
            Web1.Navigate(cc)
            While (Web1.IsBusy)
                Application.DoEvents()
            End While
  end sub
但还是不行,非要完成end sub后才显示地址为aa的网页。这又是怎么回事呢?

[此贴子已经被作者于2023-4-27 14:42编辑过]

1