在VB.NET中的WebBrowser控件中连续打开多个URL

时间:2016-07-09 16:54:15

标签: vb.net winforms ui-thread

我试图做一个" rotator"在一个循环显示一系列网址的表单上,并在WebBrowser控件中显示该网址。下面的代码显示我的表单,但表单保持白色/空白,然后一段时间后出现数组中的最后一个url。当我在每个网址之间放置一个MessageBox时,为了创建一个停靠点,它会起作用并且每个网址都会出现。我尝试用Sleep代替MessageBox,但这不起作用。我也试过增加Sleep时间,但这也没有用。如何使其正常工作?

Sub Rotate()

    Dim Urls() As String = {"www.stackoverflow.com", "www.google.com", "www.yahoo.com"}
    Dim counter As Integer = 0

    Form3.Show()

    Do Until counter = 3

        Form3.WebBrowser1.ScriptErrorsSuppressed = True
        Form3.WebBrowser1.Navigate(Urls(counter))           
        'MessageBox.Show("Next")
        counter = counter + 1
        System.Threading.Thread.Sleep(2000)

    Loop

End Sub

1 个答案:

答案 0 :(得分:0)

您可以在更改URL后调用Application.DoEvents,以便控件有机会重绘自己 但是,更好的方法是使用timer每2秒触发一次,然后更改事件处理程序中的URL,以便UI保持响应。
例如,在表单中设置一个新字段myTimer,在表单的加载事件中启动它,并在Tick事件中调用您的Rotate方法。由于现在多次调用Rotate,我们必须将counter变量移出方法并使其成为一个字段,以便我们在调用之间保持其值。我经常写C#所以希望我没有在下面做一些拼写错误:)

Private WithEvents myTimer As System.Windows.Forms.Timer
Private counter As Integer

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    ' ... your existing code ...
    counter = 0
    myTimer = New System.Windows.Forms.Timer
    myTimer.Interval = 2000
    myTimer.Enabled = True
    myTimer.Start()
End Sub

Private Sub myTimerTick() Handles myTimer.Tick
    Rotate()
End Sub

Sub Rotate()
    Dim Urls() As String = {"www.stackoverflow.com", "www.google.com", "www.yahoo.com"}
    WebBrowser1.ScriptErrorsSuppressed = True
    WebBrowser1.Navigate(Urls(counter))           
    counter = counter + 1
    If counter > 3 Then myTimer.Stop()
End Sub