sql-server - 如何在 vb.net 睡眠期间在后台运行 .Gif 图像
问题描述
我正在开发 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 图像停止动画。如何解决这个问题?
解决方案
当您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
推荐阅读
- ms-access - 女士访问如何制作具有相同行和 cromnum 值的矩阵
- python - Python MySQLdb上的SQL语法错误首先执行()
- java - 如何在 java 中使用 box sdk?
- macos - 使用 Macports 在 macOS 上安装 libelf 时出现问题
- twitter-bootstrap - Bootstrap 5 仍然推荐使用 Bootstrap-vue?
- c# - C# 无法启动 TensorFlow:缺少 dll
- php - 如何使用逗号将拆分值转换为 HTML 中的选择输入
- r - 我可以从矩阵做一个简单的回归吗?
- javascript - 为什么没有出现2个支付框!?我很混乱!(HTML JS)
- python - 多处理机会代理所有 300 个任务