vb.net中的离开延时

vb.net中的离开延时,.net,vb.net,multithreading,delay,.net,Vb.net,Multithreading,Delay,我有一个表单,在每行执行之前,我需要给出3秒的时间延迟。但是当我尝试system.threading.thread.sleep时,它会冻结UI,而且所有延迟都作为一个延迟执行。 就是 如果我有 label.text = "intializing..." sleep(5000) label1.text = "connectinh..." sleep(5000) label2.text = "connected..." sleep(5000) UI完全冻结15秒,然后所有执行都会立即发生,就好像它

我有一个表单,在每行执行之前,我需要给出3秒的时间延迟。但是当我尝试system.threading.thread.sleep时,它会冻结UI,而且所有延迟都作为一个延迟执行。 就是

如果我有

label.text = "intializing..."
sleep(5000)
label1.text = "connectinh..."
sleep(5000)
label2.text = "connected..."
sleep(5000)

UI完全冻结15秒,然后所有执行都会立即发生,就好像它们之间没有延迟语句一样。除了threading.sleep,我找不到任何其他内容。

您需要在单独的事件中更新每个标签,并让它刷新UI。 创建一个计时器,该计时器将调用事件处理程序,并在其中每次更新不同的标签。请尝试以下操作:

label.text = "intializing..."
Application.DoEvents
sleep(5000)
label1.text = "connectinh..."
Application.DoEvents
sleep(5000)
label2.text = "connected..."
Application.DoEvents
sleep(5000)
Application.DoEvents告诉操作系统处理底层工作,例如更新文本值

label.text = "intializing..."
label.Refresh
sleep(5000)
label1.text = "connectinh..."
label1.Refresh
sleep(5000)
label2.text = "connected..."
label2.Refresh
sleep(5000)
我认为这应该比DoEvents更有效

罗恩说的话:

Private Sub Form1_Shown(sender As Object, _
                        e As System.EventArgs) Handles Me.Shown
    Dim t As New Threading.Thread(AddressOf showLabelText)
    t.IsBackground = True
    t.Start()
End Sub

Const delaySecs As Integer = 3

Private Sub showLabelText()
    Dim del As New foo(AddressOf updLabel)

    Label1.BeginInvoke(del, "one")
    Threading.Thread.Sleep(delaySecs * 1000)

    Label1.BeginInvoke(del, "two")
    Threading.Thread.Sleep(delaySecs * 1000)

    Label1.BeginInvoke(del, "three")
    Threading.Thread.Sleep(delaySecs * 1000)

End Sub

Delegate Sub foo(theText As String)

Private Sub updLabel(theText As Object)
    Label1.Text = DirectCast(theText, String)
End Sub

内联解决方案,无多线程,无计时器

    Sub delay(ByVal delay_ms As Integer)
        Dim tspan As New TimeSpan
        Dim tstart = Now
        While tspan.TotalMilliseconds < delay_ms
            tspan = Now - tstart
            Application.DoEvents()
        End While
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Label1.Text = "Hello"
        delay(100) 'leaks 572 ns every 10 ms
        Label1.Text = "Salut"
    End Sub

说这件事很紧急不会让你得到更快的答案。充其量,人们会忽略它;最坏的情况是,这会激怒他们,他们会停止阅读……这只是一个形容词,我不知道为什么ppl会被它激怒。我清楚地解释了我的问题,并说它很紧急。我不认为这有什么问题。事实上,这是我所做的,在一个稍微修改的方式