Wacht 0,5 seconden voordat u doorgaat met code VB.net

Ik heb een code en ik wil dat deze ergens in het midden wacht voordat ik verder ga.
Na de WebBrowser1.Document.Window.DomWindow.execscript(“checkPasswordConfirm();”,”JavaScript”)
Ik wil dat het 0,5 seconden wacht en dan de rest van de code doet.

   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

Antwoord 1, autoriteit 100%

U moet System.Threading.Thread.Sleep(aantal milliseconden).

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

Antwoord 2, autoriteit 22%

Deze vraag is oud, maar hier is nog een antwoord omdat het nuttig is voor anderen:

thread.sleepis geen goede methode om te wachten, omdat het meestal de software bevriest tot het einde van de tijd, deze functie is beter:

  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

De bovenstaande functie wacht een bepaalde tijd zonder de software te bevriezen, maar verhoogt het CPU-gebruik.

Deze functie bevriest niet alleen de software, maar verhoogt ook niet het CPU-gebruik:

  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

Antwoord 3, autoriteit 8%

Maak een timer die elke gewenste code activeert wanneer deze tikt. Zorg ervoor dat de eerste regel in de timercode is:

timer.enabled = false

Vervang de timer door hoe je je timer ook hebt genoemd.

Gebruik dit dan in je code:

  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

Antwoord 4, autoriteit 8%

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+ hoog cpu-gebruik + geen vertraging

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-gebruik + hoge vertraging


Antwoord 5

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

Antwoord 6

Ik heb betere resultaten gehad door de gereedstatus van de browser te controleren voordat ik doorging naar de volgende stap. Dit zal niets doen totdat de browser een “complete” readystate heeft

Do While WebBrowser1.ReadyState <> 4
''' put anything here. 
Loop

Antwoord 7

Het probleem met Threading.Thread.SLeep(2000)is dat het als eerste wordt uitgevoerd in mijn VB.Net-programma. Dit

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

werkte foutloos.


Antwoord 8

De voorgestelde code bevat fouten:

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() retourneert de seconden sinds middernacht. Als dit net voor middernacht wordt gebeld, is de pauze bijna een volledige dag.
Ik zou het volgende willen voorstellen:

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

BreakCondition kan worden ingesteld op true wanneer de waitloop moet worden geannuleerd zoals DoEvents wordt genoemd, dit kan van buiten de lus worden gedaan.


Antwoord 9

Een andere manier is om te gebruiken System.Threading.ManualResetEvent

dim SecondsToWait as integer = 5
Dim Waiter As New ManualResetEvent(False)
Waiter.WaitOne(SecondsToWait * 1000) 'to get it into milliseconds

Antwoord 10

In webapplicatie is een timer de beste benadering.

Typisch, in desktoptoepassing gebruik ik dit in plaats daarvan, binnen een asynchrone methode.

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

Het werkt voor mij, en belangrijker nog, het bevriest niet het hele scherm. Maar nogmaals, dit is op desktop, ik probeer in de webtoepassing dat het vastloopt.


Antwoord 11

VB.net
4.0 kader
Code :

Threading.Thread.Sleep(5000)

Het gehele getal is in milliseconden (1 sec = 1000 milliseconden)

Ik heb het getest en het werkt

Other episodes