如何在vb.net的睡眠期间在后台运行.Gif图像

时间:2018-06-28 10:51:38

标签: sql-server vb.net

我正在研究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图像将停止动画处理。该如何解决?

1 个答案:

答案 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