我正在开发 vb.net 窗口窗体应用程序。在这里,我有一个主窗口,其中有几个 .gif 图像。这些图像将根据来自数据库的值进行动画处理。单击任何图像时,将打开一个弹出窗口。在这个弹出窗口上有六个按钮。单击任何按钮时,Sql 服务器数据库表中的相应值将更新为 1,1 秒后相同的值将更新为 0。为此,我使用了以下代码
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
Try
If (Label1.Text.Contains("Drag")) Then
tag2 = "D" + Label1.Text.Substring((Len(Label1.Text.ToString()) - 1), 1)
Else
tag2 = Label1.Text.Trim().ToString()
End If
ObjTags.Name = tag2 + ".Start"
btnStart.Enabled = False
ObjTags.DigitalValue = 1
i = ObjTags.UpdateConValue(6)
Application.DoEvents()
Thread.Sleep(1000)
ObjTags.DigitalValue = 0
i = ObjTags.UpdateConValue(6)
btnStart.Enabled = True
Catch ex As Exception
End Try
End Sub
这很好用。单击按钮时,数据库中的相应值将更新为 1,1 秒后将更新为 0。但在此操作期间,主页中的 .gif 图像停止动画。如何解决这个问题?
当您调用Thread.Sleep(1000)
UI 线程时,您是在命令 UI 线程休眠,因此在此期间 UI 不会更新。同样,当尝试在 UI 线程中更新数据库时,UI 线程将很忙,并且在此期间不会在 UI 中进行更新。
异步/等待
您可能希望使用线程或切换到 async/await 来更新数据库并应用延迟:
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Await UpdateDatabase()
Await Task.Delay(1000)
UpdateUI()
End Sub
Private Async Function UpdateDatabase() as Task
'Do time-consuming task here
End Function
Private sub UpdateUI()
'Update UI here
End sub
线
在您的情况下,由于您使用的是 .NET 4.0,您需要使用如下线程:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ts = New Threading.ThreadStart(Sub()
UpdateDatabase()
Threading.Thread.Sleep(1000)
Me.Invoke(Sub()
UpdateUI()
End Sub)
End Sub)
Dim t = New Threading.Thread(ts)
t.Start()
End Sub
Private Sub UpdateDatabase()
'Do time-consuming task here
End Sub
Private sub UpdateUI()
'Update UI here
End sub
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句