首页 > 解决方案 > 在计时器运行时停止执行

问题描述

我正在使用VB.net. 我的问题是,当我运行计时器(用于精灵动画)时,我的程序的其余部分继续执行。有没有办法延迟程序的执行,直到定时器被禁用?

我尝试过使用Threading.thread.sleep(),但这只会延迟整个过程。我认为这是因为计时器和启动它的函数都在同一个线程上运行?

While nextSpace <> endSpace
            nextSpace += 1
            timerMov.Start()
            Threading.Thread.Sleep(timerMov.Interval * 100)
End While

Private Sub mov_Tick(sender As Object, e As EventArgs) Handles timerMov.Tick
        curShip.img.Location = New Point(...)
        If i = 100 Then
            timerMov.Stop()
            i = 0
        End If
        i += 1
    End Sub

这会导致事情发生在我希望他们之前,即用户在动画完成之前收到关于他们已经登陆的空间的信息,他们已经登陆了所述空间。

谢谢你的帮助 :)

标签: .netvb.net

解决方案


基本上发生的事情是计时器从子例程内的 while 循环启动。我希望while循环等到计时器停止后再循环。

摆脱计时器并使用Async/Await

这是它的样子,归结为它的本质:

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    ' ... possibly more code ...

    While nextSpace <> endSpace
        nextSpace += 1

        For i As Integer = 0 To 100
            Await Task.Delay(someDelayIntervalHere)
            curShip.img.Location = New Point(...)
        Next
    End While

    ' ... possibly more code ...

End Sub

请注意,Sub 已Async在其声明行中标记为 。在循环内部,该Await行导致它暂停(替换 Timer 的 Tick 事件),但这样做不会导致界面冻结。


推荐阅读