首页 > 解决方案 > 如何在 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 图像停止动画。如何解决这个问题?

标签: sql-servervb.net

解决方案


当您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

推荐阅读