thread.sleep 和 textboxes/labels 之间的奇怪互动

Strange interaction between thread.sleep and textboxes/labels

我正在为基于 Arduino 的仪器编写 VB 用户界面,当仪器正在做某事时,我希望 VB 等待。为了显示当时发生的情况,我打算更改标签或文本框以更新仪器的当前状态。但是,当我将 textbox1.text="" 与 thread.sleep(n) 命令结合使用时,VB 将在更新文本框之前先执行睡眠功能。

Imports System.Threading

Public Class Form

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        TextBox1.Text = "Hello World!"
        Thread.Sleep(3000)
    End Sub

End Class

代码将等待 3 秒,然后写入 "Hello World" 知道如何在不先执行睡眠命令的情况下强制更新文本框或标签吗?

这就是 Windows 的工作方式。更新所有 UI 的线程与运行按钮单击处理程序的线程相同。通过让它休眠 3 秒,您可以停止它更新 UI 的工作。您对标签进行了更改,但它不会生效,直到线程退出您的点击处理程序方法并返回其绘制用户界面、处理点击等的正常工作

使用

Await Task.Delay(3000) 

相反,将您的点击处理程序方法标记为 Async

简而言之Async/Await允许线程暂停当前方法(您的点击)并返回到它正在做的事情,然后当延迟到期时,线程将回到您的方法并且继续它停止的地方(在 await 行之后),所有变量完好无损等。使用此方法等待长 运行 的东西(如文件 IO/downloads)而不冻结你的 UI