我正在研究vb.net窗口表单应用程序。在这里,我有一个主窗口,其中有几个.gif图像。这些图像将根据来自数据库的值进行动画处理。单击任何图像后,将打开一个弹出窗口。在此弹出窗口上有六个按钮。单击任何按钮后,Sql Server数据库表中的相应值将更新为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图像将停止动画处理。该如何解决?
答案 0 :(得分:1)
在UI线程中调用Thread.Sleep(1000)
时,您正在命令UI线程进入睡眠状态,因此UI在此期间不会更新。同样,当尝试在UI线程中更新数据库时,UI线程将很忙,并且在此期间将不对UI进行任何更新。
异步/等待
您可能要使用线程或切换到异步/等待状态以更新数据库并应用延迟:
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