27

我有一个代码,我希望它在中间某个地方等待,然后再继续。在 WebBrowser1.Document.Window.DomWindow.execscript("checkPasswordConfirm();","JavaScript") 之后,我希望它等待 0.5 秒,然后执行其余代码。

    WebBrowser1.Document.Window.DomWindow.execscript("checkPasswordConfirm();","JavaScript")

    Dim allelements As HtmlElementCollection = WebBrowser1.Document.All
    For Each webpageelement As HtmlElement In allelements
        If webpageelement.InnerText = "Sign Up" Then
            webpageelement.InvokeMember("click")
        End If
    Next
4

11 回答 11

52

您需要使用System.Threading.Thread.Sleep(number of milliseconds)

WebBrowser1.Document.Window.DomWindow.execscript("checkPasswordConfirm();","JavaScript")

Threading.Thread.Sleep(500) ' 500 milliseconds = 0.5 seconds

Dim allelements As HtmlElementCollection = WebBrowser1.Document.All
For Each webpageelement As HtmlElement In allelements
    If webpageelement.InnerText = "Sign Up" Then
        webpageelement.InvokeMember("click")
    End If
Next
于 2013-04-07T10:01:13.980 回答
12

这个问题很老,但这是另一个答案,因为它对其他人有用:

thread.sleep不是一个好的等待方法,因为通常它会冻结软件直到完成它的时间,这个函数更好:

   Imports VB = Microsoft.VisualBasic

   Public Sub wait(ByVal seconds As Single)
     Static start As Single
     start = VB.Timer()
     Do While VB.Timer() < start + seconds
       System.Windows.Forms.Application.DoEvents()
     Loop
   End Sub

上述功能会等待特定时间而不冻结软件,但会增加 CPU 使用率。

此功能不仅不会冻结软件,而且不会增加 CPU 使用率:

   Private Sub wait(ByVal seconds As Integer)
     For i As Integer = 0 To seconds * 100
       System.Threading.Thread.Sleep(10)
       Application.DoEvents()
     Next
   End Sub
于 2016-04-01T17:36:30.120 回答
5
Imports VB = Microsoft.VisualBasic

Public Sub wait(ByVal seconds As Single)
    Static start As Single
    start = VB.Timer()
    Do While VB.Timer() < start + seconds
        System.Windows.Forms.Application.DoEvents()
    Loop
End Sub

%20+ 高 CPU 使用率 + 无延迟

Private Sub wait(ByVal seconds As Integer)
    For i As Integer = 0 To seconds * 100
        System.Threading.Thread.Sleep(10)
        Application.DoEvents()
    Next
End Sub

%0.1 cpu 使用率 + 高延迟

于 2017-11-18T19:18:00.803 回答
4

做一个计时器,当它滴答作响时,它会激活你想要的任何代码。确保计时器代码的第一行是:

timer.enabled = false

用您命名的计时器替换计时器。

然后在您的代码中使用它:

   WebBrowser1.Document.Window.DomWindow.execscript("checkPasswordConfirm();","JavaScript")
timer.enabled = true
Dim allelements As HtmlElementCollection = WebBrowser1.Document.All
For Each webpageelement As HtmlElement In allelements
    If webpageelement.InnerText = "Sign Up" Then
        webpageelement.InvokeMember("click")
    End If
Next
于 2013-04-07T02:00:57.917 回答
0

建议的代码有缺陷:

Imports VB = Microsoft.VisualBasic

Public Sub wait(ByVal seconds As Single)
    Static start As Single
    start = VB.Timer()
    Do While VB.Timer() < start + seconds
        System.Windows.Forms.Application.DoEvents()
    Loop
End Sub

VB.Timer() 返回自午夜以来的秒数。如果在午夜之前调用它,则休息时间将接近一整天。我建议如下:

Private Sub Wait(ByVal Seconds As Double, Optional ByRef BreakCondition As Boolean = False)
    Dim l_WaitUntil As Date
    l_WaitUntil = Now.AddSeconds(Seconds)
    Do Until Now > l_WaitUntil
        If BreakCondition Then Exit Do
        DoEvents()
    Loop
End Sub

当调用 DoEvents 时应该取消等待循环时,可以将 BreakCondition 设置为 true,这可以从循环外部完成。

于 2019-07-02T10:29:34.677 回答
0
Static tStart As Single, tEnd As Single, myInterval As Integer
myInterval = 5 ' seconds
tStart = VB.Timer()
tEnd = myInterval + VB.Timer()
Do While tEnd > tStart
    Application.DoEvents()
    tStart = VB.Timer()
Loop
于 2018-04-03T08:15:19.453 回答
0

在继续下一步之前检查浏览器的就绪状态,我得到了更好的结果。在浏览器具有“完整”就绪状态之前,这将什么都不做

Do While WebBrowser1.ReadyState <> 4
''' put anything here. 
Loop
于 2018-09-08T19:46:01.513 回答
0

问题Threading.Thread.SLeep(2000)在于它首先在我的 VB.Net 程序中执行。这个

Imports VB = Microsoft.VisualBasic

Public Sub wait(ByVal seconds As Single)
    Static start As Single
    start = VB.Timer()
    Do While VB.Timer() < start + seconds
        System.Windows.Forms.Application.DoEvents()
    Loop
End Sub

完美地工作。

于 2019-04-28T19:04:03.487 回答
0

另一种方法是使用System.Threading.ManualResetEvent

dim SecondsToWait as integer = 5
Dim Waiter As New ManualResetEvent(False)
Waiter.WaitOne(SecondsToWait * 1000) 'to get it into milliseconds
于 2020-08-05T17:56:53.657 回答
-1

在 Web 应用程序中,计时器将是最好的方法。

仅供参考,在桌面应用程序中,我在异步方法中使用它。

... 
Await Task.Run(Sub()
    System.Threading.Thread.Sleep(5000)
End Sub)
...

它对我有用,重要的是它不会冻结整个屏幕。但这又是在桌面上,我在 Web 应用程序中尝试它确实冻结了。

于 2020-11-27T00:50:44.827 回答
-2

VB.net 4.0 框架代码:

Threading.Thread.Sleep(5000)

整数以毫秒为单位(1 秒 = 1000 毫秒)

我确实测试过它并且它有效

于 2014-06-24T15:52:14.617 回答